【问题标题】:Splitting command line args with GNU parallel使用 GNU 并行拆分命令行参数
【发布时间】:2011-06-06 16:45:33
【问题描述】:

使用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 中是否可以。

【问题讨论】:

    标签: bash file-processing gnu-parallel


    【解决方案1】:

    您可能正在寻找--colsep

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

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

    【讨论】:

    • 当我阅读最初的问题时,看起来“generate_file_pairs”会带引号输出。 --colsep 不会删除引号,对吗?假设引号围绕文本,有没有办法用平行修剪它们?例如,以下内容不起作用:echo '"file1 file2"' | parallel --colsep ' ' ./prog {1} {2}
    • 从版本 20140722: echo '"file1 file2"' |并行 --colsep ' ' echo '{=1 s/^"//=}-{=2 s/"$//=}'
    • @OleTange 是否有一些关于默认分隔符行为的讨论或文档?
    • 默认分隔符是\n。它在换行符上分开,没有别的。
    【解决方案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
    

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

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

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

    【讨论】:

      【解决方案3】:

      您正在寻找-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.
      

      【讨论】:

      • 这不会进行拆分。例如:echo hi there | parallel -n 2 echo {2} x {1} => x hi there(在这种情况下没有 {2}。)使用 --colsep:echo hi there | parallel -n 2 --colsep ' ' echo {2} x {1} ==> there x hi
      【解决方案4】:

      在Parallel的手册中是这样说的:

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

      那就试试吧:

      generate command | parallel
      

      试着理解这个的输出:

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

      【讨论】:

        猜你喜欢
        • 2013-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 2017-09-09
        • 2020-04-28
        • 2017-01-14
        相关资源
        最近更新 更多