如何计算所有字段都具有某些值的行数?

如何计算所有字段都具有某些值的行数?

我的文件如下所示:

SRR008602 97 99 99 99 98 99  98  11
SRR009633 99 99 99 99 99 100 100 10
SRR022120 0  0  0  0  0  0   0   0
SRR026121 0  0  0  0  0  0   0   0
SRR008724 80 79 99 99 99 99 99   18

我想计算第 2 列到第 9 列的值为“0”的行数。我更喜欢一个awk解决方案。这是我想到的(并且它有效),但我确信一定有更好的方法来做到这一点:

awk '$2 == 0 && $3 == 0 && $4 == 0 && $5 == 0 && $6 == 0 && $7 == 0 && $8 == 0 && $9 == 0 {n++}; END {print n}' input.txt

答案1

awk 中的 KISS:

awk '{for (i=2;i<=9;i++) if ($i != 0) next; n++} END {print n}' file

珀尔:

perl -anE '$n += 8 == grep { $_ == 0 } @F[1..8] }{ say $n' file

或(按照格伦·杰克曼的建议)使用列表::实用程序模块

perl -MList::Util=all -anE '$n++ if all {$_ == 0} @F[1..8]} {say $n' file

答案2

在 awk 中输入的内容稍微少一些:将这些字段的串联与串联零进行比较:

awk '$2$3$4$5$6$7$8 == "0000000" {++n} END { print n }' input.txt

答案3

只要您的输入数据已经过清理,就可以稍微简洁一些:

awk '$2+$3+$4+$5+$6+$7+$8+$9 == 0 {n++} END {print n}'

答案4

另一种awk方法:

awk '{$1=""} $0 !~ /[1-9]/{seen++} END{print seen}' infile
2

或者,如果您的列数超过 9,而您只想检查 2~9:

awk '$2$3$4$5$6$7$8$9 !~ /[1-9]/{seen++} END{print seen}' infile
2

相关内容