json - JQ:如果某些键值相同则合并条目

标签 json object merge jq

我想用 jq 合并一个 json 文件的条目。

如果某些已定义键的值匹配,我想合并这些条目。不匹配的数据应该存储在一个数组中。
我为此案例提供了一些示例 JSON。

如果街道和门牌号相同,我想合并这个条目并将“member”的值放入一个数组中。

匹配键:门牌号+街道必须相同。

示例输入

[{
 "street"  : "Foobar ave",
 "housenumber": 4,
 "member":"Carl"
 },
 {
 "street"  : "Foobar ave",
 "housenumber": 4,
 "member":"Bernd"
 },
 {
 "street"  : "Foobar ave",
 "housenumber": 2,
 "member":"Ann"
 }]

目标结果:

[{
 "street"  : "Foobar ave",
 "housenumber": 4,
 "members":["Carl","Bernd"]
 },
 {
 "street"  : "Foobar ave",
 "housenumber": 2,
 "members":["Ann"]
 }]

最佳答案

以下使用在 Parsing JSON lines with JQ for flapping key values in sequence 定义的通用且高效的 GROUPS_BY 版本

(GROUPS_BY 是内置 group_by 的高效版本,您也可以使用它,如下所示。)

GROUPS_BY 是面向流的。因此,“自然”使用 GROUPS_BY 来解决手头的问题是:

  GROUPS_BY(.[]; [.street, .housenumber])
  | (.[0]|del(.member)) + { members: (map(.member)) }

这会产生一个“组”流,同时保留“成员”的顺序:

{"street":"Foobar ave","housenumber":4,"members":["Carl","Bernd"]}
{"street":"Foobar ave","housenumber":2,"members":["Ann"]}

如果您要求结果是一个数组,那么只需将上面的两行程序用方括号括起来:[ .... ]

使用内置group_by的解决方案

目前,group_by 使用排序算法,这意味着可能不会保留“成员”的顺序:

group_by( [.street, .housenumber])
| map((.[0]|del(.member)) + { members: (map(.member)) })

使用 melds_by/2 的通用解决方案

给定对象流和分组标准,f,melds_by 发出 形式成对的流:

 [groupid, melded_object]

其中 melded_object 是由“groupid”组中的对象构建的对象,该组中包含所有键,每个键的值是相应值的数组:

def melds_by(stream; f):
  GROUPS_BY(stream; f)
  | . as $in
  | [ (.[0]|f),
      reduce (add|keys[]) as $k ({}; .[$k] = [$in[] | .[$k]]) ]
  ;

要将原始问题的解作为单个数组获得,我们可以简单地写成:

[ melds_by(.[]; {street, housenumber})
  | .[1] + .[0]
  | with_entries(.key |= if . == "member" then "members" else . end) ]

上面的最后一行只是重命名了“member”键。

关于json - JQ:如果某些键值相同则合并条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48155814/

相关文章:

Pandas 将空对象列添加到数据框

javascript - 将 object.keys 复制到新对象

python - 在python中解析json文件

javascript - 在另一个数组中添加 JavaScript 数组

python - 如何从 scrapy 中的 json 文件中读取行

javascript - “Removing”来自对象的多个属性,无突变

merge Mercurial fork,更改分支

javascript - 将所有 javascript 文件合并到一个文件中

dictionary - 在 Golang 中合并 map

java - Gdx运行时异常: Asset not loaded