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