2017-12-05 15 views
2

内の各項目のコマンドこれは私の入力ファイルがどのように見えるかです:私は、各項目のINSERT文を準備する必要があり実行JQ配列

[ 
    { 
    "ConfigType": "ABC", 
    "Prop1": 3, 
    "Prop2": 30 
    }, 
    { 
    "ConfigType": "XYZ", 
    "Prop3": "Hello", 
    "Prop4": "World", 
    "Prop5": "Application" 
    } 
] 

これは私のjqコマンドがどのように私に各アイテムを与えるかを示しています。

cat app-cnfg.json | jq -r ".[]" 

どのように私はaws dynamodb put-item --table-name "xxx" --item <<array's element>>を実行していますか?

答えて

4

あなたはJSON配列の各要素を抽出しbashでアレイにそれを供給し、後でその内容を反復処理するためにフィルタを適用することができます。あなたがbash 4.0以上を持っていると仮定すると、あなたは

for config in "${configArr[@]}"; do 
    aws dynamodb put-item --table-name "xxx" --item "$config" 
done 

(または)を使用し、各設定項目のコマンドを実行するために、アレイ全体

mapfile -t configArr < <(jq -c '.[]' < app-cnfg.json) 

、今ループとしてmapfileコマンドを使用することができますwhileループとreadコマンドを使用して、入力データストリーム(mapfile又はreadarrayをサポートしていないbashバージョンの作品)

から読み取るためのより効率的な方法
+0

@CharlesDuffy:完了!ありがとう – Inian

+1

最後のコードブロックは、シェルスクリプトで素晴らしい作品。ターミナルからは動作しません。おそらく 'linux'の知識が不足しています – Asdfg

+0

@Asdfg:それはうまくいくはずです!私はawsコマンドの代わりにいくつかの印刷ステートメントを追加し、彼らはうまく動作するように見えた – Inian

3

あなたはできるxargsへのパイプ:

jq -c '.[]' app-cnfg.json \ 
    | xargs -L 1 aws dynamodb put-item --table-name "xxx" --item 

JQへ-cオプションは、各要素は、単一のライン上にあり、かつxargsから-L 1オプションは、コマンドを一度アイテムごとに呼び出されていることを確認します確認します。

あなたは(argsは、現在の1の続きとして、次の行を扱うになるだろう)末尾の空白を持つ潜在的な問題を回避したい場合は、ゼロバイトが分離あなたのオブジェクトを取得することができます:

jq -j '.[] | tostring + "\u0000"' app-cnfg.json \ 
    | xargs -0 -n1 aws dynamodb put-item --table-name "xxx" --item 

-jオプションjqからの改行を抑制すると、tostringはオブジェクトを文字列化し、+ "\u0000"はゼロバイトを付加します。

xargs -0 -n1はゼロバイトで区切られた入力を期待し、一度各引数のコマンドを実行します。

+0

' -L'は興味深い選択です。 'jq'は空白文字で終わる行を決して出力してはいけません(raw文字列モードではないとき)。私はそれを理解し続ける。 –

+0

@CharlesDuffyそうです、jqからヌルバイトで区切られた出力を得ることができるかどうかを確認します。 –

+4

できます。それは少しトリッキーです。議論については、https://github.com/stedolan/jq/issues/1271を参照してください。 '-j'は改行を抑制するので、式を使ってNULを追加できます。 'jq -j '。[] | (。+ "\ u0000") ''、要約することができます(おそらくデータから除外します、適切に慎重であれば)。 –

関連する問題