es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Extraer filas en awk a un archivo línea por línea

Estoy tratando de extraer filas de un archivo .csv donde una variable coincide con un identificador específico. Aquí hay un ejemplo de conjunto de datos (myfile.csv):

id,x,y,z
A01,1,5,7
A02,4,4,7
B01,1,6,6
A01,5,7,4
A01,4,8,4
C02,3,1,3
A01,1,2,3

Podría utilizar lo siguiente:

awk -F',' '{if($1=="A01") print}' myfile.csv > outfile.csv

o

awk -F',' '{if($1=="A01") print > "outfile.csv"}' myfile.csv

lo cual resultará en outfile.csv:

A01,1,5,7
A01,5,7,4
A01,4,8,4
A01,1,2,3

Sin embargo, estoy trabajando con un conjunto de datos muy grande (200Gb) y cuando se ejecuta, tengo que esperar a que awk termine antes de que genere la salida en outfile.csv.

¿Existe alguna forma de hacer que awk imprima en el archivo en el momento en que encuentra la declaración correcta (es decir, que el archivo se actualice a medida que awk procesa)?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes utilizar la opción --source en awk para ejecutar un comando o un script externo como el archivo de entrada se está procesando, lo cual se puede utilizar para actualizar el archivo de salida mientras awk procesa el archivo de entrada. Aquí tienes un ejemplo de comando:

    awk -F',' '/A01/{print >> "outfile.csv"; fflush()}'
    

    Este comando buscará líneas que contengan “A01” en el archivo de entrada, y para cada línea coincidente, la añadirá al archivo de salida “outfile.csv” y vaciará el búffer de salida para asegurarse de que los datos se escriben realmente en el archivo antes de continuar. Ten en cuenta que se utiliza el operador >> en lugar de > para añadir al archivo de salida en lugar de sobrescribirlo.

    Utilizando este enfoque, el archivo de salida se actualizará de forma incremental mientras awk procesa el archivo de entrada, y no tendrás que esperar a que termine todo el trabajo antes de obtener resultados. Sin embargo, este enfoque puede causar una penalización en el rendimiento debido a las frecuentes operaciones de E/S involucradas en la actualización del archivo de salida, por lo que deberías probarlo en un subconjunto pequeño de tus datos antes de usarlo en el conjunto completo de datos.

Comments are closed.