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使用管道并行执行命令?的主要内容,如果未能解决你的问题,请参考以下文章