2017-02-02 5 views
4

は、だから私の目的は、JSONファイルがこの形式を得るマージすることであるマージ配列は

blahblah.json

{ 
    "title": "NamesBook", 
    "list": [ 
    { 
     "name": "Ajay" 
    } 
    ] 
} 

blueblue.json

{ 
    "title": "NamesBook", 
    "list": [ 
    { 
     "name": "Al" 
    } 
    ] 
} 

私は次のように変数内のすべての私の名前のリストの配列を格納することができます

x = jq -s '.[].list' *.json 

そして、私が見えた、out.json、私が作成したファイルに空の配列に変数を追加することを計画しました。このように:

:私のスクリプトは

ラインオーバー
jq '.list[] += "$x"' out.json' 

を実行したとき

{ 
    "type": "NamesBook", 
    "list": [] 
} 

しかし、それはJQエラーが表示されます

Cannot iterate over null.

ランダム要素を追加しても、同じエラーが表示されます。どのように進むべきかに関するヒント?配列をマージするのに役立つ他のツールはjqにありますか?

答えて

4

あなたは(JQ 1.3以降)を追加であなたのファイルをマージすることができます。

jq -s '.[0].list=[.[].list|add]|.[0]' *.json 

(JQ 1.5+)フラット化:

jq -s '.[0].list=([.[].list]|flatten)|.[0]' *.json 

[.[].list]は - すべての配列を作成します"リスト"配列

[ 
    [ 
    { 
     "name": "Ajay" 
    } 
    ], 
    [ 
    { 
     "name": "Al" 
    } 
    ] 
] 

[.[].list]|flatten -

[ 
    { 
    "name": "Ajay" 
    }, 
    { 
    "name": "Al" 
    } 
] 

.[0].list=([.[].list]|flatten)|.[0] - (一緒すべてのアレイを追加したり、.[].list|add) - は、それがを平らにマージされた1、出力それで最初の "リスト" を交換してください。

すべてのファイルが同じtitleを持つことになり、あなたは単にあなたがこれを行うことができ、list内容を組み合わせていると仮定すると、
{ 
    "title": "NamesBook", 
    "list": [ 
    { 
     "name": "Ajay" 
    }, 
    { 
     "name": "Al" 
    } 
    ] 
} 
2

:、

$ jq 'reduce inputs as $i (.; .list += $i.list)' blahblah.json blueblue.json 

これは単に最初の項目を取り、そのリストに追加されます他のすべての入力のリスト

1

.titleが "NamesBook"でないオブジェクトがある場合、OPは何が起こるべきかを指定しませんでした。目的がオブジェクトを選択することである場合。「NamesBook」に等しいタイトルは、一つは書くことができます:

map(select(.title == "NamesBook")) 
| {title: .[0].title, list: map(.list) | add} 

これは、JQは、-sオプションを指定して呼び出されることを想定しています。

ちなみに、addは簡単で高速です。