使用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:在实际运行并行命令之前,我要做两件事来检查参数是否已正确拆分。
- 在bash命令前面准备
echo
。这意味着任何最终将被执行的命令都将被打印出来,供您首先检查 - 在回波中添加一个标记,这将检查平行分割是否有效
>请注意,这最适用于小型/中型参数列表。如果参数列表很大,可能最好只使用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