GNU Parallel使用管道并行执行命令?

Posted

技术标签:

【中文标题】GNU Parallel使用管道并行执行命令?【英文标题】:Parallel executing of commands with pipe by GNU Parallel? 【发布时间】:2017-09-09 09:16:28 【问题描述】:

给定一个任务,其中包含多个通过管道组合的命令:

cat input/file1.json | jq '.responses[0] | labelAnnotations: .labelAnnotations' > output/file1.json

现在,有数千个输入 JSON 文件,我喜欢利用 GNU Parallel 来并行化所有进程。我怎么能那样做?像这样?

parallel cat | jq '...' > output/./ ::: input/*.json

注意:如果jq 的过滤器中有管道,情况会更加复杂......

【问题讨论】:

尝试在|< 前面加上一个反斜杠来引用它们,然后使用parallel --dry-run ... 看看它在不做任何事情的情况下会做什么。 太棒了!如果jq的过滤器里面有管道怎么办? 您的jq 命令已经在单引号内,所以我认为它们应该没问题。 不。它不起作用。得到了这样的东西/bin/bash: labelAnnotations:: command not found 你能把 jq 周围的单引号换成双引号吗? 【参考方案1】:

https://www.gnu.org/software/parallel/man.html#QUOTING 说:

结论:为了避免处理引用问题,编写一个小脚本或一个函数(记住export -f该函数)并让GNU并行调用它可能更容易。

在你的情况下,它看起来像这样:

doit() 
  cat "$1" |
    jq '.responses[0] | labelAnnotations: .labelAnnotations' > "$2" 

export -f doit

parallel doit  output// ::: input/*.json

这样做的好处是您可以对其进行测试:

doit input/foo1.json output/foo1.json

当它起作用时,并行化它是微不足道的。

如果您有更新版本的 GNU Parallel,这也应该可以:

parallel --results output// -q jq '.responses[0] | labelAnnotations: .labelAnnotations' ::: input/*.json

【讨论】:

谢谢!我确实通过编写一个小脚本解决了这个引用挑战。您对-q--results 的分享也很棒!

以上是关于GNU Parallel使用管道并行执行命令?的主要内容,如果未能解决你的问题,请参考以下文章

gnu并行管道sed - 没有输入文件错误

使用 if else 和 xargs 并行管道到 gnu

Gnu并行卡住了,没有输出

使用 python 子进程运行 GNU 并行命令

从 GNU 并行获取退出状态值

sh 使用cytominer_scripts和GNU parallel并行处理平板