Excluindo delimitadores delimitados por corte

5

Digamos que eu tenha um arquivo CSV:

"col1","col2","col3"
"col4","col5,subtext","col6

O problema que tenho é o seguinte:

cut -d, -f1,2 test.txt
"coll1","col2"
"col4","col5

A saída desejada é:

"col1","col2"
"col4","col5,subtext"
    
por Little Code 27.10.2016 / 14:35

4 respostas

5

O módulo ParseWords, que acompanha o Perl, aborda isso com bastante elegância. Exemplo abaixo.

$ perl -MText::ParseWords -nE '@a=quotewords ",",1,$_;say $a[0],",",$a[1]' <test.txt
"col1","col2"
"col4","col5,subtext"
$
    
por 27.10.2016 / 15:02
4

Se você tiver gawk v4 disponível, existe uma boa solução em Analise um csv usando awk e ignorando vírgulas dentro de um campo

Exemplo:

gawk -vFPAT='[^,]*|"[^"]*"' '{print $1 "," $2}' test.txt
    
por 27.10.2016 / 14:41
4

Outra solução perl , assumindo que todos os campos são citados

$ perl -F'/"\K,(?=")/' -lane 'print "$F[0],$F[1]"' test.txt 
"col1","col2"
"col4","col5,subtext"
  • O separador de campo -F'/"\K,(?=")/' é apenas vírgula se for precedido por " e seguido por "
  • print "$F[0],$F[1]" imprime os dois primeiros campos separados por ,


Pode ser feito com grep também

$ grep -oE '^"[^"]*","[^"]*"' test.txt 
"col1","col2"
"col4","col5,subtext"

Se N campos forem necessários, use grep -oE '^("[^"]*",){1}"[^"]*"' , onde o número dentro de {} é N-1

    
por 27.10.2016 / 15:56
2

você também pode tentar isso com awk como abaixo;

awk -F'","'  '{printf "%s\",\"%s\"\n", $1, $2 }' test.txt 

Por exemplo;

user@host$ awk -F'","'  '{printf "%s\",\"%s\"\n", $1, $2 }' test.txt 
"col1","col2"
"col4","col5,subtext"
    
por 27.10.2016 / 14:50