2011-06-06 13 views
30

Usando GNU parallel: http://www.gnu.org/software/parallel/Splitting args línea de comandos con GNU paralelas

Tengo un programa que toma dos argumentos, por ejemplo

$ ./prog file1 file2 
$ ./prog file2 file3 
... 
$ ./prog file23456 file23457 

estoy usando un script que genera los pares de nombres de archivo, sin embargo, esto plantea un problema porque el resultado de la secuencia de comandos es una sola cadena - no un par. como:

$ ./prog "file1 file2" 

GNU parallel parece tener un montón de trucos bajo la manga, me pregunto si hay uno para el texto división en torno separadores:

$ generate_file_pairs | parallel ./prog ? 
    # where ? is text under consideration, like "file1 file2" 

El trabajo fácil alrededor es dividir los argumentos manualmente Prog, pero me gustaría saber si es posible en GNU parallel.

Respuesta

54

Usted probablemente está buscando --colsep.

generate_file_pairs | parallel --colsep ' ' ./prog {1} {2} 

Lea man parallel para más. Y ver el vídeo de introducción si no lo ha hecho http://www.youtube.com/watch?v=OpaiGYxkSuQ

+0

Esto es exactamente, gracias! – drhodes

+0

Al leer la pregunta inicial, parece que "generate_file_pairs" saldrá con las comillas. '--colsep' no eliminará las comillas, ¿correcto? Suponiendo que las comillas rodean el texto, ¿hay alguna forma de recortarlos con paralelos? Por ejemplo, lo siguiente no funciona: 'echo '" file1 file2 "' | paralelo - colsep '' ./prog {1} {2} ' –

+0

A partir de la versión 20140722: echo '" archivo1 archivo2 "' | parallel - colsep '' echo '{= 1 s/^ "// =} - {= 2 s /" $ // =}' –

1

Está buscando -n opción de paralelo. Esto es lo que busca:

./generate_file_pairs | parallel -n 2 ./prog {} 

Extracto de GNU Parallel Doc:

-n max-args 
    Use at most max-args arguments per command line. Fewer than max-args 
    arguments will be used if the size (see the -s option) is exceeded, 
    unless the -x option is given, in which case GNU parallel will exit. 
+0

bien, pero todavía tiene la opción -n. Editaré en consecuencia. – ssapkota

+0

Esto no hará la división. por ejemplo: 'echo hi there all | paralelo -n 2 echo {2} x {1} '=> x hi there (No hay {2} en este caso.) Usando --colsep:' echo hi there | paralelo -n 2 - colsep '' echo {2} x {1} '==> there x hola –

0

En el manual del Paralelo, se dice:

Si no se da ningún comando, se ejecuta la línea de entrada ... GNU paralelo puede a menudo ser utilizado como un sustituto de xargs o cat | intento.

Así que toma una oportunidad de:

generate command | parallel 

tratar de entender la salida de este:

for i in {1..5};do echo "echo $i";done | parallel 
Cuestiones relacionadas