使用GNU并行拆分命令行args

时间:2011-06-06 16:45:34

标签: bash file-processing gnu-parallel

使用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 个答案:

答案 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 {}

摘自GNU Parallel Doc

-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

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

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

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