如何在jq中的多个对象中收集数组值字段的唯一元素?

时间:2014-09-30 19:39:13

标签: arrays json jq

我的json数据看起来像:

{"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"并收集bar的唯一值,然后收集" baz"中的唯一值。阵列:

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

(我不在乎结果是在一个数组中,还是只是一个空白分隔的JSON对象的原始序列,我不在乎" baz&中项目的顺序#34;数组)

我从源代码安装了jq 1.4版。我可以通过" foo"并收集" bar"的独特价值。用:

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

得到以下特性:

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

但是我无法弄清楚如何收集" baz"的独特价值。

我错过了什么?

1 个答案:

答案 0 :(得分: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]}
]