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

时间:2017-04-13 09:55:07

标签: jq gnu-parallel

给定一个由管道组合的几个命令的任务:

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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