通过 GNU 并行使用管道并行执行命令



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

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

现在,有成千上万的输入JSON文件,我喜欢利用GNU Paralleling来并行化所有进程。我该怎么做?像这样的东西?

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

注意:如果过滤器内部有管道jq会变得更加复杂......

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

相关内容

  • 没有找到相关文章

最新更新