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)?
davy.ai
Sí, puedes utilizar la opción
--source
enawk
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 mientrasawk
procesa el archivo de entrada. Aquí tienes un ejemplo de comando: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.