【问题标题】:JQ: Merge Entries if some key values are identicalJQ:如果某些键值相同,则合并条目
【发布时间】:2018-06-17 18:10:59
【问题描述】:

我想将 json 文件的条目与 jq 合并。

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

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

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

示例输入

[{
 "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"]
 }]

【问题讨论】:

    标签: json object merge jq


    【解决方案1】:

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

    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”键。

    【讨论】:

    • 感谢您的帮助:)。
    猜你喜欢
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 2017-04-05
    • 1970-01-01
    • 2014-11-21
    • 2021-01-17
    • 1970-01-01
    相关资源
    最近更新 更多