将json对象与jq合并

时间:2017-09-16 13:55:15

标签: json object merge grouping jq

我有一个JSON列表,我想在命令行上合并。

输入:
[
 {
   "ipaddress": "10.10.10.222",
   "name": "alice"
 },
 {
   "ipaddress": "10.20.20.77",
   "name": "bob"
 },
 {
   "version": "6.7",
   "name": "alice"
 },
 {
   "version": "5.2.2",
   "name": "bob"
 }
]

预期产出:

{"name": "alice", "ipaddress": "10.10.10.222", "version": "6.7"},
{"name": "bob", "ipaddress": "10.20.20.77", "version": "5.2.2"}
你可以帮帮我吗?谢谢。 贝恩德

2 个答案:

答案 0 :(得分:3)

jq -c 'group_by(.name)[]|add' input.json

生成一个JSON对象流(即没有插入逗号)。

最好还是完全避免group_by/1,因为它涉及到一种:

def add_by(f):
  reduce .[] as $x ({}; ($x|f) as $f | .[$f] += [$x])
  | [.[] | add];

add_by(.name)

答案 1 :(得分:2)

如果样本数据在data.json中,则命令

$ jq -Mr '[ group_by(.name)[] | add | tojson ] | join(",\n")' data.json

将产生输出

{"name": "alice", "ipaddress": "10.10.10.222", "version": "6.7"},
{"name": "bob", "ipaddress": "10.20.20.77", "version": "5.2.2"}

但是,如果实际需要的是单个对象数组,那么命令

$ jq -M '[group_by(.name)[] | add]' data.json

产生

[
  {
    "ipaddress": "10.10.10.222",
    "name": "alice",
    "version": "6.7"
  },
  {
    "ipaddress": "10.20.20.77",
    "name": "bob",
    "version": "5.2.2"
  }
]