给定一个任务,其中包含多个通过管道组合的命令:
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