Como usar o comando “cut” para cortar campos em um arquivo CSV quando os campos contiverem vírgulas?

2

Formato de arquivos CSV Dados como os abaixo

"Pizza,wings,icecream","hopper","0",,"Masdfasdf","USA","381","10 AM","cap",,,"monster"

Usando uma vírgula como o delimitador, como abaixo, resultará em campos com vírgulas a serem contados como delimitadores, o que não é o que eu quero.

cat /path/to/file | cut -d , -f2

retornará

wings

quando eu quiser

hopper

Acho que encontrei uma solução logicamente, mas não tenho certeza de como implementá-la.

Como eu faria um delimitador que diria "Se eu for uma vírgula, cercado por outra vírgula ou aspas, conte comigo como um delimitador"?

Exemplo

[tksmith@rifle ~]$ cat deleteme 

"Pizza,wings,icecream","hopper","0",,"Masdfasdf","USA","381","10 AM","cap",,,"monster"

[tksmith@rifle ~]$ cat deleteme | cut -d , -f2

wings
    
por TrevorKS 28.06.2018 / 21:56

2 respostas

2

O comando de comando de corte apenas delimita um caractere por vez. Assim, você pode transformar as aspas e aspas em outro delimitador de caractere único usando sed e um regexp. Por exemplo:

sed -e 's/","\|",\|,"\|,,/@/g' /path/to/file | cut -d@ -f2

retornará

hopper

Outra maneira é usar o AWK. Por exemplo, o seguinte lhe daria o segundo campo.

awk -F ',,|^"|","|",|,"|"$' '{print $3}' /path/to/file

retornará

hopper

Os exemplos acima não são perfeitos, pois eles não tratam todos os casos corretamente com vários campos vazios e cotações externas. É melhor usar uma linguagem de script de nível superior com um módulo de análise de CSV.

    
por 28.06.2018 / 22:59
2

O formato CSV tem argumentos de borda suficientes para os quais você não deseja reinventar a análise. Use um analisador de CSV adequado. Por exemplo, com ruby

ruby -rcsv -e 'CSV.foreach(ARGV.shift) {|row| puts row[1]}' file
    
por 29.06.2018 / 00:06