Digamos que tengo un archivo CSV:
"col1","col2","col3"
"col4","col5,subtext","col6
El problema que tengo es el siguiente:
cut -d, -f1,2 test.txt
"coll1","col2"
"col4","col5
El resultado deseado es:
"col1","col2"
"col4","col5,subtext"
Respuesta1
El módulo ParseWords, que viene con Perl, cubre esto de manera bastante elegante. Ejemplo a continuación.
$ perl -MText::ParseWords -nE '@a=quotewords ",",1,$_;say $a[0],",",$a[1]' <test.txt
"col1","col2"
"col4","col5,subtext"
$
Respuesta2
Si tiene gawk
v4 disponible, existe una buena solución enAnalizar un csv usando awk e ignorando comas dentro de un campo
Ejemplo:
gawk -vFPAT='[^,]*|"[^"]*"' '{print $1 "," $2}' test.txt
Respuesta3
Otra perl
solución, suponiendo que todos los campos estén citados.
$ perl -F'/"\K,(?=")/' -lane 'print "$F[0],$F[1]"' test.txt
"col1","col2"
"col4","col5,subtext"
-F'/"\K,(?=")/'
El separador de campo es una coma sólo si va precedido"
y seguido de"
print "$F[0],$F[1]"
imprimir los dos primeros campos separados por,
grep
También se puede hacer con
$ grep -oE '^"[^"]*","[^"]*"' test.txt
"col1","col2"
"col4","col5,subtext"
Si se necesita N número de campos, utilice donde esté grep -oE '^("[^"]*",){1}"[^"]*"'
el número interior{}
N-1
Respuesta4
También puedes probar esto con awk como se muestra a continuación;
awk -F'","' '{printf "%s\",\"%s\"\n", $1, $2 }' test.txt
P.ej;
user@host$ awk -F'","' '{printf "%s\",\"%s\"\n", $1, $2 }' test.txt
"col1","col2"
"col4","col5,subtext"