使用GNU并行拆分命令行参数



使用GNU parallel:http://www.gnu.org/software/parallel/

我有一个接受两个参数的程序,例如

$ ./prog file1 file2
$ ./prog file2 file3
...
$ ./prog file23456 file23457

我使用的是一个生成文件名对的脚本,但这会带来问题,因为脚本的结果是一个字符串,而不是一对。类似:

$ ./prog "file1 file2"

GNU parallel似乎有很多技巧,我想知道是否有一个可以在分隔符周围拆分文本的技巧:

$ generate_file_pairs | parallel ./prog ?  
  # where ? is text under consideration, like "file1 file2"

简单的解决方法是在prog中手动拆分args,但我想知道在GNU parallel中是否可行。

您可能正在寻找--colsep

generate_file_pairs | parallel --colsep ' ' ./prog {1} {2}  

阅读man parallel了解更多信息。如果你还没有看过介绍视频http://www.youtube.com/watch?v=OpaiGYxkSuQ

很晚才来这里聚会,但我经常遇到这个问题,并找到了一个很好的简单解决方案

在将arg列表传递给parallel之前,只需用换行符替换所有空格。我发现tr是这种东西最快的

不工作

echo "1 2 3 4 5"  | parallel echo --
-- 1 2 3 4 5

工作

echo "1 2 3 4 5" | tr ' ' 'n' | parallel echo --
-- 1
-- 2
-- 3
-- 4
-- 5

Protip:在实际运行并行命令之前,我要做两件事来检查参数是否已正确拆分。

  1. 在bash命令前面准备echo。这意味着任何最终将被执行的命令都将被打印出来,供您首先检查
  2. 在回波中添加一个标记,这将检查平行分割是否有效

>请注意,这最适用于小型/中型参数列表。如果参数列表很大,可能最好只使用for循环将每个参数回显到并行

您正在寻找并行的-n选项。这就是您正在寻找的:

./generate_file_pairs | parallel -n 2 ./prog {}

摘自GNU并行文档:

-n max-args
    Use at most max-args arguments per command line. Fewer than max-args 
    arguments will be used if the size (see the -s option) is exceeded, 
    unless the -x option is given, in which case GNU parallel will exit.

在Parallel的手册中说:

如果没有给出命令,则执行输入行。。。GNU并行通常可以用作xargs或cat|bash的替代品。

所以尝试一下:

generate command | parallel

试着理解这个输出:

for i in {1..5};do echo "echo $i";done | parallel

最新更新