使用汇总数据重塑 jq 数组

Reshape a jq array with summarized data

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 中执行此操作,因为它需要将值映射为字段名称?

使用 mapfrom_entries 创建输入:

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

map 生成类似于 [{"key": "a", "value": 1}, ...] 的对象列表。 from_entries 将其变成单个对象 {"a": 1, ...}。在最终对象中,lengthfrom_entries 都获得与输入相同的数组,它们的输出用于通过 CountAgents 键创建最终对象。

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

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

用于构造 JSON 的对象值迭代器 .[]。对于给定的 .["a"],它 returns "a" 这就是最终 JSON.

中键的构造方式