Como remover linha baseada em Delimeter em perl / Shell?

1

Alguém pode ajudar a remover a linha no arquivo com base no delimitador (Comma), Incase se a linha contém menos número de colunas ou registros ruins, precisa excluí-los.

Input File:

a,b,c,d
a,b,d,f
c,d
a,v,b,h
d,e,v,n

No arquivo acima, se o delimitador for menor que 4, eu preciso excluir a linha do arquivo.

Output File :

a,b,c,d
a,b,d,f
a,v,b,h
d,e,v,n

O comando abaixo me dá o número do delimitador em uma linha, como posso excluir se não for igual a 4,

egrep -iv '"' file.csv | awk -F',' '{print NF}' 

Obrigado.

    
por William R 06.04.2015 / 12:40

4 respostas

3

com perl :

$ perl -F, -i.bak -ane 'print if @F > 3' file

com perl > 5.20, você pode usar -F sem -a e -n ( -F implica -a e -a implica -n ).

Ou você pode usar sed :

$ sed -i.bak -e '/\([^,]*,\)\{3,\}/!d' file
    
por 06.04.2015 / 13:35
6

Outro perl: imprima uma linha se houver 3 vírgulas.

perl -i.bak -ne 'print if tr/,/,/==3' file

O operador tr retorna o número de caracteres transliterados.

    
por 06.04.2015 / 13:47
3

Você pode usar o awk:

awk -F',' 'NF==4' file

Se você pode usar gawk versão > = 4.1.0, você pode usar inplace , mais info . Então pode ser:

gawk -i inplace -v INPLACE_SUFFIX=.bak -F',' 'NF==4' file
    
por 06.04.2015 / 12:43
2

Com o GNU sed:

sed -nE '/^.+,.+,.+,.+$/p' file > output_file
    
por 06.04.2015 / 12:46

Tags