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"
Responder1
O módulo ParseWords, que acompanha Perl, cobre isso de maneira bastante elegante. Exemplo abaixo.
$ perl -MText::ParseWords -nE '@a=quotewords ",",1,$_;say $a[0],",",$a[1]' <test.txt
"col1","col2"
"col4","col5,subtext"
$
Responder2
Se você tiver gawk
a v4 disponível, existe uma boa solução emAnalise um csv usando awk e ignorando vírgulas dentro de um campo
Exemplo:
gawk -vFPAT='[^,]*|"[^"]*"' '{print $1 "," $2}' test.txt
Responder3
Outra perl
solução, assumindo que todos os campos estão entre aspas
$ perl -F'/"\K,(?=")/' -lane 'print "$F[0],$F[1]"' test.txt
"col1","col2"
"col4","col5,subtext"
-F'/"\K,(?=")/'
separador de campo é vírgula somente se for precedido"
e seguido por"
print "$F[0],$F[1]"
imprima os dois primeiros campos separados por,
Pode ser feito grep
também
$ grep -oE '^"[^"]*","[^"]*"' test.txt
"col1","col2"
"col4","col5,subtext"
Se for necessário um número N de campos, use grep -oE '^("[^"]*",){1}"[^"]*"'
onde o número dentro {}
forN-1
Responder4
você também pode tentar isso com o awk conforme 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"