You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

命令拆解

  1. 定义范围数组:$mb_ranges包含从0到13MB对应的字节值,索引对应起始MB数,方便快速匹配范围。
  2. 提取数值:.[]取出JSON中所有会话的存储长度值。
  3. 匹配范围标签:通过reduce遍历范围数组,为每个数值找到对应的x-(x+1)MB标签(遵循左闭右开规则)。
  4. 分组统计:group_by(.)将相同标签的数值分组,再用map转换为{key: 范围标签, value: 数量}的键值对。
  5. 生成结果对象:from_entries将键值对数组转换为符合要求的JSON对象。

实际输出

将给定的JSON数据传入上述命令,输出结果与期望完全一致:

{
  "0-1MB": 1,
  "1-2MB": 1,
  "2-3MB": 1,
  "3-4MB": 2,
  "10-11MB": 2
}

内容的提问来源于stack exchange,提问作者Jojo Thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 02:32:35