single print escape escapar comillas awk delimiter double-quotes separator

print - Separador de escapes dentro de comillas dobles, en awk



awk print single quote (3)

Estoy usando awk para analizar mis datos con "," como separador ya que la entrada es un archivo csv. Sin embargo, hay "," dentro de los datos que se escapó mediante comillas dobles ("...").

Ejemplo

filed1,filed2,field3,"field4,FOO,BAR",field5

¿Cómo puedo ignorar la coma "," dentro de la comilla doble para que pueda analizar la salida correctamente usando awk? Sé que podemos hacer esto en Excel, pero ¿cómo lo hacemos en awk?


Analizadores de CSV completos como Perl''s Text::CSV_XS están especialmente diseñados para manejar ese tipo de rareza.

Supongamos que solo desea imprimir el 4 ° campo:

perl -MText::CSV_XS -lne ''BEGIN{$csv=Text::CSV_XS->new()} if($csv->parse($_)){ @f=$csv->fields(); print "/"$f[3]/"" }'' file

La línea de entrada se divide en array @f
El campo 4 es $f[3] ya que Perl comienza a indexar a 0

Proporcioné más explicación de Text::CSV_XS en mi respuesta aquí: analizar el archivo csv usando gawk


Es fácil, con GNU awk 4 :

zsh-4.3.12[t]% awk ''{ for (i = 0; ++i <= NF;) printf "field %d => %s/n", i, $i }'' FPAT=''([^,]+)|("[^"]+")'' infile field 1 => filed1 field 2 => filed2 field 3 => field3 field 4 => "field4,FOO,BAR" field 5 => field5

Agregar algunos comentarios según el requisito de OP.

Del manual GNU awk :

El valor de FPAT debe ser una cadena que proporciona una expresión regular. Esta expresión regular describe el contenido de cada campo. En el caso de los datos CSV presentados anteriormente, cada campo es "cualquier cosa que no sea una coma" o "una comilla doble, cualquier cosa que no sea una comilla doble y una comilla doble de cierre". Si se escribe como una expresión regular constante (ver Capítulo 3 [Expresiones regulares], página 37), tendríamos / ([^,] +) | ("[^"] + ") /. Escribir esto como una cadena requiere que evitemos las comillas dobles, lo que lleva a: FPAT = "([^,] +) | (/" [^ / "] + /") "


FPAT funciona cuando hay nuevas líneas y comas dentro de los campos entre comillas, pero no cuando hay comillas dobles, como esta:

field1,"field,2","but this field has ""escaped"" quotes"

Puede usar un programa contenedor simple que escribí llamado csvquote para facilitar la interpretación de awk y luego restaurar los caracteres especiales problemáticos, como este:

csvquote inputfile.csv | awk -F, ''{print $4}'' | csvquote -u

Consulte https://github.com/dbro/csvquote para obtener el código y los documentos