2011-11-04 9 views
5

¿Es posible invocar gnu paralelo de forma que repita la primera línea de entrada original al STDIN de cada trabajo secundario?procesamiento de un archivo CSV con headen con gnu paralelo

Tengo un archivo CSV que contiene una línea de encabezado en la parte superior. Por ejemplo:

> cat large.csv 
id,count 
abc,123 
def,456 

tengo una herramienta que puede extraer columnas por su nombre en lugar de la posición:

> csv_extract large.csv count 
123 
456 

puedo sumar los valores de serie como:

> csv_extract large.csv count | awk '{ SUM += $1 } END { print SUM }' 
579 

El archivo que he real tener es mucho más grande, y la operación más compleja que la suma, pero se aplicarían los mismos principios. Me gustaría usar gnu en paralelo para procesar el archivo, pero no sé si es posible decirle a gnu en paralelo que repita el encabezado CSV para cada trabajo.

Lo ideal sería que pudiera ejecutar la operación con algo como:

> cat large.csv | parallel --pipe --repeat-first-line "csv_extract /dev/stdin count | awk '{ SUM += $1 } END { print SUM }'" 
579 

que he hecho hasta la opción -primera línea --repeat arriba para representar la funcionalidad no puedo averiguar. He visto los videos de YouTube y he leído la página de manual, pero no puedo ver cómo se puede hacer, si es posible.

Gracias!

  • danboo
+0

¿podría hacer una carrera por separado de 'parallel' que sólo se suma a la cabecera de todos los archivos cuando el procesamiento se realiza? O en realidad un bucle 'for', si controlas dónde y qué nombres se usan para tus archivos de salida' paralelos'. ¡Buena suerte! – shellter

Respuesta

5

Hoy puede --skip-first-line y añadir la cabecera usando echo:

seq 10 | parallel --skip-first-line --pipe '(echo hea,der; cat) | my_prog' 

En una versión futura tendrá la opción '--header' que será una expresión regular que coincide con el final de su encabezado (por ejemplo: '\ n' para una línea o '\ n. * \ n' para dos líneas o '---' para hasta e incluyendo la primera ---)

- Editar -

nueva versión de GNU paralelo puede hacer ahora:

parallel --pipe --header : my_program 
+0

Espero la opción '--header'. Y gracias por la idea de 'echo'. Aunque no es lo suficientemente general para mi uso, al menos puedo usar algo similar para los archivos del disco: 'cat large.csv | paralelo --skip-first-line - pipe '(head -1 large.csv; cat) | my_prog'' – danboo

Cuestiones relacionadas