保持带有head的列包含一个字符串

时间:2016-03-31 00:33:15

标签: bash awk

我有一个像这样的文件

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”。在真实文件中,列数非常大。我无法指望它。

2 个答案:

答案 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

哪个会产生相同的输出。 (注意:上方只关注您为变量25指定的列r12r23,其余部分为字段使用相同的 dummy temp 变量t。)最后t将读取行的其余部分,无论其格式如何阅读r23