如何使用JQ统计每个对象中键值对出现次数,按member_id分组统计title数量
按member_id分组统计title出现次数的JQ实现方案
正确JQ语句
方案1:仅统计指定title(如foo),性能更优
jq 'map({id: .member_id, title: "foo", count: ([.loans[].media[] | select(.title == "foo")] | length)})[]' member.json
逻辑说明:
- 直接遍历外层每一个用户对象,无需先拆分再回组
- 统计单个用户下所有
loans节点的media数组中,title等于foo的条目总数,直接构造输出对象 - 末尾的
[]用于把数组结果展开为逐行输出的独立对象,匹配预期的输出格式
方案2:通用多title全量分组统计,支持同时统计所有title的分组次数
jq 'map(.member_id as $m | .loans[].media[] | {id: $m, title: .title}) | group_by([.id, .title])[] | {id: .[0].id, title: .[0].title, count: length}' member.json
逻辑说明:
- 先把所有
media条目展开为带用户id和title的对象数组 - 用
group_by按[用户id, title]二元组作为分组键 - 每个分组的长度即为对应id和title的出现次数,最后构造输出对象即可
- 之前出现的报错是因为分组时未正确指定分组键的格式,导致JQ尝试对比不同类型的值进行排序分组触发类型不兼容错误
输出结果
运行上述任意语句针对提供的样例JSON,都可以得到预期输出:
{ "id": 123, "title": "foo", "count": 2 } { "id": 456, "title": "foo", "count": 1 }
内容的提问来源于stack exchange,提问作者Cyrille37
相关产品推荐
相关产品推荐

