使用汇总数据重塑 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 中执行此操作,因为它需要将值映射为字段名称?
使用 map
为 from_entries
创建输入:
map({key: .Agents, value: .Count}) | {Count: length, Agents: from_entries}
map
生成类似于 [{"key": "a", "value": 1}, ...]
的对象列表。 from_entries
将其变成单个对象 {"a": 1, ...}
。在最终对象中,length
和 from_entries
都获得与输入相同的数组,它们的输出用于通过 Count
和 Agents
键创建最终对象。
使用 reduce
的另一种变体是做。 reduce 表达式将数组作为输入,并将键作为 Agents
,将值作为其对应的 Count
值。
jq '{ Count: length, Agents: (reduce .[] as $d ({}; .[$d.Agents] = $d.Count)) }'
用于构造 JSON 的对象值迭代器 .[]
。对于给定的 .["a"]
,它 returns "a"
这就是最终 JSON.
中键的构造方式
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 中执行此操作,因为它需要将值映射为字段名称?
使用 map
为 from_entries
创建输入:
map({key: .Agents, value: .Count}) | {Count: length, Agents: from_entries}
map
生成类似于 [{"key": "a", "value": 1}, ...]
的对象列表。 from_entries
将其变成单个对象 {"a": 1, ...}
。在最终对象中,length
和 from_entries
都获得与输入相同的数组,它们的输出用于通过 Count
和 Agents
键创建最终对象。
使用 reduce
的另一种变体是做。 reduce 表达式将数组作为输入,并将键作为 Agents
,将值作为其对应的 Count
值。
jq '{ Count: length, Agents: (reduce .[] as $d ({}; .[$d.Agents] = $d.Count)) }'
用于构造 JSON 的对象值迭代器 .[]
。对于给定的 .["a"]
,它 returns "a"
这就是最终 JSON.