2017-04-13 20 views
1

:今GNU並列によるパイプによるコマンドの並列実行?パイプで組み合わせ、いくつかのコマンドを使用してタスクを考える

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

は、入力されたJSONファイルの何千もある、と私はすべてのプロセスを並列化するためにGNUパラレルを活用したいです。どうすればいい?このようなもの?

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

注:jqのフィルタ内部のパイプがある場合、それがさらに複雑になります...

+0

てみてください|'と '<'それぞれの前にバックスラッシュを置くことによってと '並列--dryを使用します何もせずに何をするのかを見てみましょう。 –

+0

恐ろしい!そして 'jq'のフィルターの中にパイプがあるとどうなりますか? – Drake

+0

あなたの 'jq'コマンドはすでに一重引用符で囲まれているので、うまくいくはずです。 –

答えて

2

https://www.gnu.org/software/parallel/man.html#QUOTINGは言う:

結論:引用を扱う避けるために小さなスクリプトや関数(関数export -fに覚えておいてください)を書いてGNU並列呼び出しをするのは簡単かもしれません。あなたのケースでは

それは次のようになります。

doit input/foo1.json output/foo1.json 

そして、それが動作するとき、それを並列化することは簡単です:

doit() { 
    cat "$1" | 
    jq '.responses[0] | {labelAnnotations: .labelAnnotations}' > "$2" 
} 
export -f doit 

parallel doit {} output/{/} ::: input/*.json 

これについての素晴らしい事は、あなたがそれをテストすることができるということです。

あなたがGNUの新しいバージョンを持っている場合は、あまりにも、これは動作するはずパラレル: `引用

parallel --results output/{/} -q jq '.responses[0] | {labelAnnotations: .labelAnnotations}' ::: input/*.json 
+0

ありがとう!私は小さなスクリプトを書くことによってこの引用の課題を解決しました。 '-q'と' --results'に関するあなたの共有も素晴らしいです! – Drake

関連する問題