すべてのフィールドに特定の値を持つ行数を計算する方法は?

すべてのフィールドに特定の値を持つ行数を計算する方法は?

私のファイルは次のとおりです。

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

または(Glenn Jackmanが提案したように)リスト::ユーティリティ基準寸法

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

関連情報