Contagem de ocorrência do número e exclusão da linha do valor das correspondências

1

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 ?

    
por P. HamB 16.03.2016 / 11:56

4 respostas

1

com o awk

awk -F, '{z=0; for (i=2; i<=NF; i++) if ($i == 0) z++} z != 5' file > newfile
    
por 16.03.2016 / 13:08
3

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.
por 16.03.2016 / 12:19
1

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).

    
por 16.03.2016 / 12:37
0
awk 'gsub(/,0/, ",0", $0) != 5' data.input
    
por 02.05.2017 / 01:02

Tags