Excluyendo delimitadores cerrados con corte

Excluyendo delimitadores cerrados con corte

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 gawkv4 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 perlsolució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,


grepTambié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"

información relacionada