我刚开始使用 gnu-parallel。我正在尝试与几个变量并行进给。假设我有一个包含以下内容的文本文件 (foo.txt),
> cat foo.txt
a b c
d e f
Run Code Online (Sandbox Code Playgroud)
现在,如果我运行以下命令,
> range=$(eval echo {10..15})
> parallel -a foo.txt --colsep=' ' echo {} {#} {1} {2} {3} ::: $range
Run Code Online (Sandbox Code Playgroud)
而不是得到,
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
Run Code Online (Sandbox Code Playgroud)
我明白了,
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
Run Code Online (Sandbox Code Playgroud)
我怎样才能做对?
{}是完整的输入行,它是通过对所有输入源(文件的行和命令行参数)进行笛卡尔乘积而生成的。如果您只想要每行的数字部分,它最终会成为第四列,您必须像其他列一样引用它:
$ 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
Run Code Online (Sandbox Code Playgroud)
还要注意对范围变量使用数组以避免丑陋的eval echo.