45

使用GNU parallelhttp ://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.

4

4 回答 4

80

您可能正在寻找--colsep.

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

阅读man parallel更多。如果您还没有这样做,请观看介绍视频http://www.youtube.com/watch?v=OpaiGYxkSuQ

于 2011-06-06T21:25:56.450 回答
2

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

在将 arg 列表传递给并行之前,只需用换行符替换所有空格。我发现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

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

  1. 在bashecho命令之前添加。这意味着最终将执行的任何命令都将被打印出来供您首先检查
  2. 在回声中添加一个标记,这将检查并行拆分是否实际工作

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

于 2021-03-24T02:13:29.763 回答
1

您正在寻找-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.
于 2011-06-06T18:05:37.920 回答
1

在 Parallel 的手册中说:

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

所以尝试一下:

generate command | parallel

试着理解这个的输出:

for i in {1..5};do echo "echo $i";done | parallel
于 2016-12-14T08:28:03.103 回答