jq分组(group by)同时实现增量计数的技术问询
Got it!我来帮你实现这个用jq按organizationId分组并统计状态计数的需求,直接上完整解决方案:
用jq实现分组统计服务器状态
咱们的目标是把输入的服务器数据按组织ID分组,同时统计每个组织下的总服务器数、UP状态数量和DOWN状态数量。
原始输入数据(Sample input1.json)
[{ "organizationId": "org1", "status": "UP", "server": "server1", "somekey1" : "somevalue1" }, { "organizationId": "org1", "status": "DOWN", "server": "server2", "somekey2" : "somevalue2" }, { "organizationId": "org1", "status": "DOWN", "server": "server3" }, { "organizationId": "org2", "server": "server1", "status": "UP", "somekey2" : "somevalue2" }, { "organizationId": "org2", "server": "server2", "status": "UP", "somekey4" : "somevalue4" }]
执行的jq命令
jq 'group_by(.organizationId) | map({ organizationId: .[0].organizationId, totalServers: length, upCount: map(select(.status == "UP")) | length, downCount: map(select(.status == "DOWN")) | length })' Sample input1.json
命令细节拆解
group_by(.organizationId):将原始JSON数组按照organizationId字段分组,每个分组对应一个组织的所有服务器数据子数组map(...):遍历每个分组,构造最终的统计结果对象:organizationId: .[0].organizationId:提取分组的组织ID(同一分组内所有元素的该值完全一致)totalServers: length:直接取分组的元素个数,就是该组织的总服务器数量upCount: map(select(.status == "UP")) | length:先筛选出分组内状态为UP的条目,再统计这些条目的数量downCount: map(select(.status == "DOWN")) | length:同理,筛选并统计状态为DOWN的条目数量
最终输出结果(Expected output.json)
[ { "organizationId": "org1", "totalServers": 3, "upCount": 1, "downCount": 2 }, { "organizationId": "org2", "totalServers": 2, "upCount": 2, "downCount": 0 } ]
内容的提问来源于stack exchange,提问作者Naveen K Reddy
相关产品推荐
相关产品推荐

