GNU Параллельно с несколькими переменными

#bash #gnu-parallel

Вопрос:

Я только начал использовать gnu-parallel. Я пытаюсь работать параллельно с несколькими переменными. Предположим, у меня есть текстовый файл (foo.txt) с содержанием ниже,

 > cat foo.txt
a b c
d e f
 

Теперь, если я выполню приведенную ниже команду,

 > range=$(eval echo {10..15})
> parallel -a foo.txt --colsep=' ' echo {} {#} {1} {2} {3} ::: $range
 

вместо того, чтобы получить,

 10 1 a b c
11 2 a b c
12 3 a b c
13 4 a b c
14 5 a b c
15 6 a b c
10 7 d e f
11 8 d e f
12 9 d e f
14 11 d e f
15 12 d e f
13 10 d e f
 

Я понимаю это,

 a b c 10 1 a b c
a b c 11 2 a b c
a b c 12 3 a b c
a b c 13 4 a b c
a b c 14 5 a b c
a b c 15 6 a b c
d e f 10 7 d e f
d e f 11 8 d e f
d e f 12 9 d e f
d e f 14 11 d e f
d e f 15 12 d e f
d e f 13 10 d e f
 

Как я могу сделать это правильно?

Ответ №1:

{} это полная строка ввода, которая генерируется путем выполнения декартова произведения всех источников ввода — строк файла и аргументов командной строки. Если вам просто нужна числовая часть каждой строки, она окажется четвертой колонкой, на которую вам придется ссылаться, как и на другие столбцы:

 $ range=( {10..15} )
$ parallel -a foo.txt --colsep=' ' echo {4} {#} {1} {2} {3} ::: "${range[@]}"
10 1 a b c
11 2 a b c
12 3 a b c
13 4 a b c
14 5 a b c
15 6 a b c
10 7 d e f
11 8 d e f
12 9 d e f
13 10 d e f
14 11 d e f
15 12 d e f
 

Также обратите внимание на использование массива для переменной диапазона, чтобы избежать этого уродства eval echo .