给定一个由管道组合的几个命令的任务:
cat input/file1.json | jq '.responses[0] | {labelAnnotations: .labelAnnotations}' > output/file1.json
现在,有数千个输入JSON文件,我喜欢利用GNU Parallel来并行化所有进程。我怎么能这样做?像这样的东西?
parallel cat {} | jq '...' > output/{./} ::: input/*.json
注意:如果jq
的过滤器内有管道,则会变得更加复杂......
答案 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