如何用jq将JSON数据中的时间值按ID分组为数组?
用jq实现按id分组聚合time值数组
没问题,用jq的几个核心函数组合就能轻松搞定这个分组需求,一行命令就能出结果!
核心命令
假设你的原始JSON数据保存在input.json文件中,运行以下命令:
jq 'group_by(.id) | map({key: .[0].id, value: [.[].time]}) | from_entries' input.json
分步解释
我拆解开给你讲每个步骤的作用,方便理解:
group_by(.id):先把原始数组按id字段分组,会得到一个二维数组,每个子数组里都是相同id的对象。比如你的数据会变成:[ [{"id":"abc","time":34},{"id":"abc","time":45}], [{"id":"def","time":25}] ]map({key: .[0].id, value: [.[].time]}):遍历每个分组,把每个分组转换成{key: 分组的id, value: 该组所有time值组成的数组}的结构。这一步后数据会变成:[ {"key":"abc","value":[34,45]}, {"key":"def","value":[25]} ]from_entries:最后把这个键值对数组转换成标准的JSON对象,也就是你想要的最终格式:{ "abc": [34,45], "def": [25] }
直接处理管道输入
如果不想存文件,也可以直接通过管道传数据,比如:
echo '[ { "id": "abc", "time": 34 }, { "id": "def", "time": 25 }, { "id": "abc", "time": 45 } ]' | jq 'group_by(.id) | map({key: .[0].id, value: [.[].time]}) | from_entries'
这个方案完全用jq原生函数实现,不需要额外编程语言,我日常处理这类JSON聚合需求经常用,非常顺手~
内容的提问来源于stack exchange,提问作者Patrick Connelly
相关产品推荐
相关产品推荐

