我有一个像这样的文件
ID rs_2312 ._C ._G rs_8923 ._A ._T
2 2 1 1 5 2 4
3 3 6 6 7 8 9
我想要的输出是
rs_2312 rs_8923
2 5
3 7
那就是我想保持名称中的列包含“rs”。在真实文件中,列数非常大。我无法指望它。
答案 0 :(得分:1)
awk
救援!
$ awk 'NR==1{for(i=1;i<=NF;i++) if($i~/^rs/) h[i]}
{for(i=1;i<=NF;i++)
printf "%s", ((i in h)?$i FS:""); print ""}' file |
column -t
rs_2312 rs_8923
2 5
3 7
答案 1 :(得分:1)
或者您可以通过printf
格式化输出非常简单,例如
$ awk '{printf "%-8s %s\n", $2, $5}' file.txt
rs_2312 rs_8923
2 5
3 7
printf
为您提供C(或bash或awk)中的格式控制范围。这是保持您寻求的格式的另一种方式。有关完整的格式字符串和格式说明符选项,请参阅man 3 printf
。
除了awk
之外,您还可以使用简单的while
循环,例如:
$ while read -r t r12 t t r23 t; do \
printf "%-8s %s\n" "$r12" "$r23" \
done <file.txt
哪个会产生相同的输出。 (注意:上方只关注您为变量2
和5
指定的列r12
和r23
,其余部分为字段使用相同的 dummy 或 temp 变量t
。)最后t
将读取行的其余部分,无论其格式如何阅读r23
。