[英]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.