使用awk打印所有字段的值小于指定的数字

时间:2014-05-20 14:30:52

标签: bash awk

我有一个制表符分隔的文件,我有兴趣打印小于或等于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 

3 个答案:

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