将多个参数传递给 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 中具有特殊含义的字符(例如?*)。其他字符(例如 $ ' " `)都可以。
我有一个名为 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 中具有特殊含义的字符(例如?*)。其他字符(例如 $ ' " `)都可以。