【问题标题】:jq: How can I combine data from duplicate keysjq:如何组合来自重复键的数据
【发布时间】:2017-04-11 04:55:15
【问题描述】:

我有一个相当复杂的 JSON 数据结构,我已经设法使用 jq 过滤到某些键及其值。我需要合并结果,所以重复的键只有一个值数组。
例如

     {
    "1.NBT.B": [
      {
        "id": 545
      },
      {
        "id": 546
       }
    ]
  },
  {
    "1.NBT.B": [
      {
        "id": 1281
      },
      {
        "id": 1077
      }
    ]
  }

会导致

 {
    "1.NBT.B": [
      {
        "id": 545
      },
      {
        "id": 546
       },
      {
        "id": 1281
      },
      {
        "id": 1077
      }
    ]
  },
...

甚至更好:

[{"1.NBT.B": [545, 546, 1281, 1077]}, ...]

我需要这样做,而不必直接输入密钥(“1.NBT.B”),因为有数百个这样的密钥。我认为最让我困惑的是这里的对象没有命名——对象之间的键不一样。

这样的事情只会给我第二组 id,完成跳过第一组:

reduce .[] as $item ({}; . + $item)

【问题讨论】:

    标签: json merge key jq


    【解决方案1】:

    第 1 部分

    下面的 jq 函数以问题第一部分所设想的方式组合了一个对象数组。

    # Given an array of objects, produce a single object with an array at
    # every key, the array at each key, k, being formed from all the values at k.
    def merge:
      reduce .[] as $o ({}; reduce ($o|keys)[] as $key (.; .[$key] += $o[$key] ));
    

    与此定义一起行:

    merge
    

    在文件中,并将示例输入修改为有效的 JSON 数组, 结果是:

    {
      "1.NBT.B": [
        {
          "id": 545
        },
        {
          "id": 546
        },
        {
          "id": 1281
        },
        {
          "id": 1077
        }
      ]
    }
    

    第 2 部分

    使用上面定义的merge,过滤器:

    merge | with_entries( .value |= map(.id) )
    

    产生:

    {
      "1.NBT.B": [
        545,
        546,
        1281,
        1077
      ]
    }
    

    【讨论】:

    • 非常感谢,这简直太棒了!这也有助于我找出其他类似的过滤器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 2019-07-22
    • 2020-11-19
    相关资源
    最近更新 更多