com o awk
awk -F, '{z=0; for (i=2; i<=NF; i++) if ($i == 0) z++} z != 5' file > newfile
Poderia receber ajuda por favor com o meu problema? Eu tenho um arquivo que se parece com isso (separado por vírgulas):
A,250,13,820,0,80,201
B,0,0,0,0,3,0
C,0,2,1,0,0,0
D,0,1,105,0,0,10
Eu gostaria de remover uma linha se ela tiver 5 valores zero reais, neste caso, linha B. O arquivo final deve se parecer com:
A,250,13,820,0,80,201
C,0,2,1,0,0,0
D,0,1,105,0,0,10
Eu tenho dificuldades para escrever o código porque awk
sempre considera todos os zeros (cada linha tem cinco valores zero, mas somente a linha B tem cinco zeros verdadeiros). Seria mais fácil com um script perl
?
Perl para o resgate!
perl -aF, -ne 'print unless 5 == grep /^0$/, @F;' < input > output
-n
lê a linha de entrada por linha -a
divide cada linha no array @F -F
especifica como dividir (em uma vírgula nesse caso) grep
usado no contexto escalar retorna o número de ocorrências. Contanto que nenhum outro número além de 0
comece com 0
em seu arquivo e que o primeiro campo não seja um número como em sua amostra, você poderia fazer:
sed -ne 's/,0//5;t' -e p < input > output
Note que elimina as linhas que têm pelo menos 5 zeros.
Com sua amostra novamente, a:
grep ',.*[1-9].*,.*[1-9]'
também faria isso (procura por dois campos diferentes de zero após o primeiro).
awk 'gsub(/,0/, ",0", $0) != 5' data.input