【问题标题】:Reshape a jq array with summarized data使用汇总数据重塑 jq 数组
【发布时间】:2020-01-09 14:30:26
【问题描述】:

jq 的新手,但我已经设法将大量数据分组,现在我希望以不同的格式对其进行汇总。分组和映射后的原始数据:

[
  {
    "Agents": "a",
    "Count": 1
  },
  {
    "Agents": "b",
    "Count": 50
  },
  {
    "Agents": "c",
    "Count": 25
  },
  {
    "Agents": "d",
    "Count": 1
  },
  {
    "Agents": "e",
    "Count": 4
  },
  {
    "Agents": "f",
    "Count": 4
  },
  {
    "Agents": "g",
    "Count": 4
  }
]

我想要这个输出:

{
  "Count": 7,
  "Agents": {
    "a": 1,
    "b": 50,
    "c": 25,
    "d": 1,
    "e": 4,
    "f": 4,
    "g": 4
  }
}

请问我该如何在 jq 中执行此操作,因为它需要将值映射为字段名称?

【问题讨论】:

    标签: json dictionary group-by jq reshape


    【解决方案1】:

    使用reduce 的另一个变体是这样做。 reduce 表达式将数组作为输入,并将键作为Agents,将值作为其对应的Count 值。

    jq '{ Count: length, Agents: (reduce .[] as $d ({}; .[$d.Agents] = $d.Count)) }'
    

    用于构造 JSON 的对象值迭代器 .[]。对于给定的.["a"],它返回"a",这就是最终 JSON 中键的构造方式。

    【讨论】:

      【解决方案2】:

      使用mapfrom_entries 创建一个输入:

      map({key: .Agents, value: .Count}) | {Count: length, Agents: from_entries}
      

      map 生成一个对象列表,如[{"key": "a", "value": 1}, ...]from_entries 将其转换为单个对象 {"a": 1, ...}。在最终对象中,lengthfrom_entries 都获得了与输入相同的数组,并且它们的输出用于创建具有 CountAgents 键的最终对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-31
        • 2020-07-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多