La respuesta superior para esta pregunta solo funciona para líneas con un solo campo entre comillas. Cuando encontré esta pregunta, necesitaba algo que pudiera funcionar para una cantidad arbitraria de campos cotizados.
Finalmente me encontré con an answer by Wintermute in another thread, y proporcionó una buena solución generalizada para este problema. Lo acabo de modificar para eliminar las comillas. Tenga en cuenta que necesita invocar awk con -F\"
cuando ejecuta el siguiente programa.
BEGIN { OFS = "" } {
for (i = 1; i <= NF; i += 2) {
gsub(/[ \t]+/, ",", $i)
}
print
}
Esto funciona mediante la observación de que todos los demás elementos de la matriz estará dentro de las comillas cuando se separan por el "-character, y de forma que sustituye el espacio en blanco que divide los que no entre comillas con una coma.
continuación, se pueden encadenar fácilmente otra instancia de awk para hacer lo que necesita procesamiento (sólo tiene que utilizar el interruptor separador de campo de nuevo, -F,
)
tenga en cuenta que esto podría romperse si se cita el primer campo -. yo no tengo probado. Si lo hace, sin embargo, debería ser fácil de arreglar agregando una instrucción if para comenzar en 2 rath mayor que 1 si el primer carácter de la línea es un ".
Para formatear para un trazador de líneas: 'cat data.txt | awk 'split ($ 0, a, "\" ") {$ 2 = a [2]} {$ 3 = $ (NF - 1)} {$ 4 = $ NF} {imprimir" y los campos son ", $ 1," + ", $ 2," + ", $ 3," + ", $ 4} '' –
Esto solo funciona si tiene un solo campo cotizado, en la segunda posición, y tiene 4 campos en total. No es genérico. Una solución donde aceptará cualquier campo citado en cualquier posición será ideal. –