2014-09-30 63 views
4

我JSON數據,看起來像:如何收集jq中多個對象的數組值域的唯一元素?

{"foo":"one", "bar":2, "baz":[0]} 
{"foo":"two", "bar":3, "baz":[1]} 
{"foo":"one", "bar":3, "baz":[2,3]} 
{"foo":"one", "bar":2, "baz":[2,4]} 

我想組都使用相同的「foo」和收集欄的唯一值,然後領取「巴茲」陣列內的唯一值:

[ 
    {"foo":"one", "bar":[2, 3], "baz":[0,2,3,4]}, 
    {"foo":"two", "bar":[3], "baz":[1]} 
] 

(I不在乎如果結果是在陣列中,或只是由空格組成的原始序列分開JSON對象,我不關心的項目的「baz」的數組中的順序)

我已經安裝了jq 1.4版本CE。我可以正確地被「富」,收集「酒吧」的獨特價值與組:

jq -s 'group_by(.foo) | map({foo: .[0].foo, bar: map(.bar) | unique})' 

產生:

[ 
    {"foo":"one","bar":[2,3]}, 
    {"foo":"two","bar":[3]} 
] 

,但我無法弄清楚如何做的唯一值的集合「巴茲」。

我錯過了什麼?

回答

5

編輯:新的 「flatten」 功能並不需要(感謝 @JeffMercado)

我可以運行

jq -s 'group_by(.foo) | map({foo: .[0].foo, bar: map(.bar) | unique, baz: map(.baz) | add | unique}) 

主要生產:

[ 
    {"foo":"one","bar":[2,3],"baz":[0,2,3,4]}, 
    {"foo":"two","bar":[3],"baz":[1]} 
] 
+0

可以只使用你'添加' – 2014-09-30 20:38:12

+0

@JeffMercado你有一個如何做到這一點的例子嗎? – bskaggs 2014-09-30 20:45:10

+1

只需用'add'替換'flatten'即可。幸運的是,所有baz值都是數組,因此將數組添加到一起具有相同的效果。 – 2014-09-30 20:47:57

相關問題