我有一个制表符分隔的文件,我有兴趣打印小于或等于1的所有值。
输入数据:
OG1_1908 1 1 1 1 1
OG1_1909 1 1 1 1 1
OG1_1910 1 1 1 1 1
OG1_1000 5 6 6 0 0
OG1_1001 0 0 0 13 2
OG1_3987 1 0 1 0 0
OG1_3998 1 0 1 0 0
OG1_1002 2 7 2 1 2
OG1_3999 1 0 1 0 0
OG1_4000 1 0 1 0 0
输出数据:
OG1_3987 1 0 1 0 0
OG1_3998 1 0 1 0 0
OG1_3999 1 0 1 0 0
OG1_4000 1 0 1 0 0
OG1_1908 1 1 1 1 1
OG1_1909 1 1 1 1 1
OG1_1910 1 1 1 1 1
我有以下单行,但我觉得这不是最聪明的命令,因为我为每个感兴趣的字段指定了每个条件。是否有更好的awk命令可以处理输入数据的任意数量的字段文件?谢谢
awk -F '\t' '{ if ( $2 <= 1 && $3 <= 1 && $4 <= 1 && $5 <= 1 && $6 <=1) print $0 }' inputfile
答案 0 :(得分:2)
从第二列开始迭代您的字段直到行尾。如果遇到值大于1的字段,请转到下一行。如果没有,请打印该行。
$ awk '{for(i=2;i<=NF;i++)if($i>1){next}}1' file
OG1_1908 1 1 1 1 1
OG1_1909 1 1 1 1 1
OG1_1910 1 1 1 1 1
OG1_3987 1 0 1 0 0
OG1_3998 1 0 1 0 0
OG1_3999 1 0 1 0 0
OG1_4000 1 0 1 0 0
答案 1 :(得分:2)
遍历所有字段并在>1
时跳过行。然后,print
,只有在未跳过该行时才会发生。
$ awk '{for (i=2; i<=NF; i++) if ($i>1) next } {print}' file
OG1_1908 1 1 1 1 1
OG1_1909 1 1 1 1 1
OG1_1910 1 1 1 1 1
OG1_3987 1 0 1 0 0
OG1_3998 1 0 1 0 0
OG1_3999 1 0 1 0 0
OG1_4000 1 0 1 0 0
答案 2 :(得分:1)
awk '{p = 1; for( i = 2; i <= NF; i++ ) if ( $i > 1 ) p = 0} p'