如何使用jq按数值范围统计会话存储长度的键值对JSON分布
问题描述
给定如下会话存储长度的JSON数据:
{ "session1": 128, "session2": 1048596, "session3": 3145728, "session4": 3145828, "session5": 11534338, "session6": 11544336, "session7": 2097252 }
需要用jq工具按左闭右开的数值范围(0-1MB、1-2MB……12-13MB)统计各范围的会话数量,各MB对应的字节值如下:
1MB = 1048576 2MB = 2097152 3MB = 3145728 4MB = 4194304 5MB = 5242880 6MB = 6291456 7MB = 7340032 8MB = 8388608 9MB = 9437184 10MB = 10485760 11MB = 11534336 12MB = 12582912 13MB = 13631488
期望输出示例:
{ "0-1MB": 1, "1-2MB": 1, "2-3MB": 1, "3-4MB": 2, "10-11MB": 2 }
解决方案
可以用以下jq命令实现统计:
[0, 1048576, 2097152, 3145728, 4194304, 5242880, 6291456, 7340032, 8388608, 9437184, 10485760, 11534336, 12582912, 13631488] as $mb_ranges | .[] | reduce range(0; $mb_ranges|length -1) as $i (null; if . >= $mb_ranges[$i] and . < $mb_ranges[$i+1] then "\($i)-\($i+1)MB" else . end ) | group_by(.) | map({key: .[0], value: length}) | from_entries
命令拆解
- 定义范围数组:
$mb_ranges包含从0到13MB对应的字节值,索引对应起始MB数,方便快速匹配范围。 - 提取数值:
.[]取出JSON中所有会话的存储长度值。 - 匹配范围标签:通过
reduce遍历范围数组,为每个数值找到对应的x-(x+1)MB标签(遵循左闭右开规则)。 - 分组统计:
group_by(.)将相同标签的数值分组,再用map转换为{key: 范围标签, value: 数量}的键值对。 - 生成结果对象:
from_entries将键值对数组转换为符合要求的JSON对象。
实际输出
将给定的JSON数据传入上述命令,输出结果与期望完全一致:
{ "0-1MB": 1, "1-2MB": 1, "2-3MB": 1, "3-4MB": 2, "10-11MB": 2 }
内容的提问来源于stack exchange,提问作者Jojo Thomas
相关产品推荐
相关产品推荐

