如何在 GNU Parallel 中传递作业号?

如何在 GNU Parallel 中传递作业号?

我通过并行命令将变量从脚本传递到主脚本,例如

./script1 | parallel -u --jobs 3 "./script2 {}"

如何将职位编号作为 的第二个参数传递./script2

就像是

./script1 | parallel -u --jobs 3 "./script2 {} {}" ::: {1..3}

但第一个{}应该来自./script1.

请注意,我不想要参数的组合。相反,正在运行的作业应该是

./script2 var1 1
./script2 var2 2
./script2 var3 3
./script2 var4 1
./script2 var5 2
./script2 var6 3
./script2 var7 1

想象一下./script2' writes to filesfile1.txt ,files2.txt , andfile3.txt where the number is{1..3}` 或作业编号。

我想确保只有一个脚本正在写入其相应的文件。换句话说,三个并行作业写入三个指定文件。

答案1

您很可能正在寻找 {%},它不是职位编号,而是职位投币口数字。

LC_ALL=C seq 10 -0.1 1 | shuf |
  parallel --lb 'echo Job {} grabs {%}; sleep {}; echo Job {} releases {%}'

请注意,当一个数字被释放时,它是如何被下一个作业获取的。因此,并行运行的 2 个作业不会具有相同的 {%} 值。

GNU Parallel 2018 的第 5 章对此进行了介绍(http://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html或者https://doi.org/10.5281/zenodo.1146014)。

答案2

我发现解决方案是--link标记来聚合组合。

parallel -u --jobs 3 --link ./script2 {1} {2} :::: <(./script1) ::: {1..3}

然后,{1}来自脚本,并且{2}只是定期匹配。

相关内容