使用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
中进行。
答案 0 :(得分:64)
您可能正在寻找--colsep
。
generate_file_pairs | parallel --colsep ' ' ./prog {1} {2}
阅读man parallel
了解更多信息。如果您还没有这样做,请观看介绍视频http://www.youtube.com/watch?v=OpaiGYxkSuQ
答案 1 :(得分:1)
您正在寻找并行的-n
选项。这就是你要找的东西:
./generate_file_pairs | parallel -n 2 ./prog {}
-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.
答案 2 :(得分:1)
在平行手册中,有人说:
如果没有给出命令,则执行输入行...... GNU parallel通常可以用作xargs或cat的替代品。 bash中。
所以试试看:
generate command | parallel
尝试理解这个的输出:
for i in {1..5};do echo "echo $i";done | parallel
答案 3 :(得分:0)
很晚参加聚会,但我经常遇到这个问题并找到了一个很好的简单解决方案
在将 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
提示:在实际运行并行命令之前,我会做两件事来检查参数是否已正确拆分。
echo
。这意味着最终将执行的任何命令都会打印出来供您首先检查> 注意,这对小/中参数列表最有效。如果参数列表非常大,最好只使用 for 循环将每个参数回显并行