Разделение аргументов командной строки с помощью GNU параллельно - PullRequest
37 голосов
/ 06 июня 2011

Использование GNU parallel: http://www.gnu.org/software/parallel/

У меня есть программа, которая принимает два аргумента, например,

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

Я использую скрипт, который генерирует пары имен файлов, однакоэто создает проблему, потому что результатом скрипта является одна строка, а не пара.например:

$ ./prog "file1 file2"

GNU parallel, кажется, имеет множество хитростей в рукавах, интересно, есть ли один для разделения текста вокруг разделителей:

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

Легко обойти эторазделить аргументы вручную в проге, но я хотел бы знать, возможно ли это в GNU parallel.

Ответы [ 3 ]

64 голосов
/ 07 июня 2011

Вы, вероятно, ищете --colsep.

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

Подробнее читайте man parallel.И посмотрите вступительное видео, если вы еще этого не сделали http://www.youtube.com/watch?v=OpaiGYxkSuQ

1 голос
/ 14 декабря 2016

В руководстве Параллеля сказано:

Если команда не указана, строка ввода выполняется ... Параллельно GNU часто можно использовать вместо xargs или cat | Баш.

Так что попробуйте:

generate command | parallel

Попытайтесь понять вывод этого:

for i in {1..5};do echo "echo $i";done | parallel
1 голос
/ 06 июня 2011

Вы ищете -n вариант параллельной работы. Это то, что вы ищете:

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

Выдержка из 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.
...