Como contar o número de linhas onde todos os campos têm algum valor?

0

Veja como meu arquivo se parece:

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

Gostaria de contar o número de linhas em que as colunas 2 a 9 têm um valor "0". Eu prefiro uma solução awk . Aqui está o que eu fiz (e funciona), mas tenho certeza que deve haver uma maneira melhor de fazer isso:

awk '$2 == 0 && $3 == 0 && $4 == 0 && $5 == 0 && $6 == 0 && $7 == 0 && $8 == 0 && $9 == 0 {n++}; END {print n}' input.txt
    
por ThePresident 11.06.2018 / 18:38

6 respostas

4

KISS no awk:

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

Perl:

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

ou (como sugerido por Glenn Jackman) usando o módulo List :: Util

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

Ligeiramente menos digitação no awk: compare a concatenação desses campos com zeros concatenados:

awk '$2$3$4$5$6$7$8 == "0000000" {++n} END { print n }' input.txt
    
por 11.06.2018 / 19:13
0

Um pouco mais sucinto, desde que seus dados de entrada já estejam limpos:

awk '$2+$3+$4+$5+$6+$7+$8+$9 == 0 {n++} END {print n}'
    
por 11.06.2018 / 18:47
0
$ cut -d ' ' -f  2- <file | grep -v '[^0 ]' | wc -l
       2

Ou seja, primeiro remova a primeira coluna separada por espaço com cut , depois grep para linhas contendo apenas zeros e espaços e, em seguida, conte essas linhas.

Ou usando grep para fazer a contagem:

$ cut -d ' ' -f 2- <file | tr -d ' ' | grep -cx '00000000'
2
    
por 11.06.2018 / 19:08
0

Outra abordagem awk :

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

Ou no caso de você ter mais de 9 colunas e desejar apenas verificar 2 ~ 9:

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

com grep :

grep -Exc '[^[:space:]]+([[:space:]]+0){8}'
    
por 11.06.2018 / 20:10

Tags