繁体   English   中英

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

[英]Print values less than specified number for all fields with 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 

从第二列开始到行尾遍历您的字段。 如果遇到值大于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时都跳过行。 然后, 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
 awk '{p = 1; for( i = 2; i <= NF; i++ ) if ( $i > 1 ) p = 0} p'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM