将多个参数传递给 GNU parallel

Passing multiple parameters to GNU parallel

我有一个名为 sample.sh 的示例脚本,它接受三个输入 X、Y 和 Z

>> cat sample.sh

#! /bin/bash

X=
Y=
Z=#3

file=X_Y_Z
echo `hostname` `date` >> ./$file

现在我可以通过以下方式给参数:

parallel ./sample.sh {1} {2} {3} ::: 1.0000 1.1000 ::: 2.0000 2.1000 ::: 3.0000 3.1000

或者我可以这样做:

parallel ./sample.sh {1} {2} {3} :::: xlist ylist zlist

其中 xlist、ylist 和 zlist 是包含参数列表的文件。

但是如果我想要一个名为 parameter.dat 的文件怎么办?

>>> cat parameter.dat
#xlist
1.0000 1.1000
#ylist
2.0000 2.1000
#zlist
3.0000 3.1000

我可以使用 awk 读取 parameter.dat 并生成名为 xlist、ylist 等的临时文件... 但是有没有更好的方法使用 gnu-parallel 本身?

最终我要寻找的是简单地添加更多行的 xlist、ylist 和 zlist 到 parameter.dat 并使用 xlist、ylist 或 zlist 的最后一个实例到 运行 sample.sh 与,以便我记录参数 运行s 我已经在 parameter.dat 本身完成。 我正在寻找一种优雅的方式来做到这一点。

编辑:我目前的解决方案是:

#! /bin/bash
tail -1 < parameter.dat | head -1 | awk '{=};1' | tr ' ' '\n' > zlist
tail -3 < parameter.dat | head -1 | awk '{=};1' | tr ' ' '\n' > ylist
tail -5 < parameter.dat | head -1 | awk '{=};1' | tr ' ' '\n' > xlist

parallel ./sample.sh {1} {2} {3} :::: xlist ylist zlist

rm xlist ylist zlist

没有内置的方法来做你想做的事,你的解决方案也不错。

如果您控制 parameter.dat 并且它不是太大 (128 KB) 我可能会这样做:

$ cat parameter.dat
::: x valueX1 ValueX2
::: y valueY1 ValueY2
::: z ValueZ1 ValueZ2 ValueZ3

# There is on purpose no " around $() and the ::: is in parameter.dat
$ parallel --header : ./sample.sh $(cat parameter.dat)

--header :用于忽略每行的第一个值。这也意味着您可以在命令模板中使用 {x} {y} 和 {z}。

这很容易添加另一个参数,您不需要清理 tmp 文件。

但是,您受到限制:您的值不能包含 space 和某些在 shell 中具有特殊含义的字符(例如?*)。其他字符(例如 $ ' " `)都可以。