使用并行从列表中运行具有多个参数的程序

thi*_*oso 2 command-line bash shell-script gnu-parallel

我有一个通过命令行(Ubuntu)运行的 bash 程序,如下所示:

./extract_field.sh ABC001
Run Code Online (Sandbox Code Playgroud)

ABC001我想从给定的 shapefile 中提取的字段 ID在哪里。

要使用多个 ID 运行此脚本,我首先在list.txt文件中每行保存一个 ID :

ABC001
ABC014
ABC213
ABC427
Run Code Online (Sandbox Code Playgroud)

然后使用parallel以下方法调用脚本:

parallel -a list.txt ./extract_field.sh
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。

但是,我计划进行更改,extract_field.sh因此需要两个参数而不是一个参数。如果我只是将文本文件更改为每行容纳两个参数,上述工作流程是否仍然有效?

ABC001 arg2a
ABC014 arg2b
ABC213 arg2c
ABC427 arg2d
Run Code Online (Sandbox Code Playgroud)

通过这种变化,我希望parallel -a list.txt ./extract_field.sh表现得像

./extract_field.sh ABC001 arg2a
./extract_field.sh ABC014 arg2b
Run Code Online (Sandbox Code Playgroud)

等等。

那正确吗?

我可以在询问之前先对其进行测试,但我决定先询问,因为脚本中的此更改可能需要我几个小时才能完成(尽管这听起来像是一个简单的更改)。

Ree*_*ost 5

您可以通过在命令语法中指定列分隔符来为单个命令提供多个参数并行使用您的示例:

parallel --colsep ' ' -a list.txt ./extractfield.sh {1} {2}
Run Code Online (Sandbox Code Playgroud)

将提供结果

./extract_field.sh ABC001 arg2a
./extract_field.sh ABC014 arg2b
Run Code Online (Sandbox Code Playgroud)

鉴于您的文件list.txt包含

ABC001 arg2a
ABC014 arg2b
Run Code Online (Sandbox Code Playgroud)

您可以使用cp或mv因为它们都需要多个位置参数来测试。

有用的并行联机帮助页

  • Alsp 尝试`--dry-run`。 (2认同)