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

使用jq从字符串列表生成指定结构的JSON对象

按路径前缀分组JSON数组的jq解决方案

问题场景

给定JSON格式的路径字符串列表,需要将其转换为以前两段路径为键、对应前缀路径列表为值的映射对象。

原始输入

[
  "nonprod/global/app/sit01",
  "nonprod/global/app/dev02",
  "prod/na/app/prod01",
  "test/eu/app/cust01",
  "nonprod/global/app/dev03"
]

期望输出

{
  "nonprod/global":[
    "nonprod/global/app/sit01",
    "nonprod/global/app/dev02",
    "nonprod/global/app/dev03"
  ],
  "prod/na":[
    "prod/na/app/prod01"
  ],
  "test/eu":[
    "test/eu/app/cust01"
  ]
}

原命令问题

你之前使用的jq命令:

jq 'reduce (.[] | capture("(?<env_type>([^/]*/[^/]*))").env_type as $key | {($key) : [.]}) as $item ({}; . *= $item)'

问题在于用*=合并对象时,相同键的数组会被直接覆盖,最终每个键只保留最后一个匹配的路径,而非所有匹配项。

正确解决方案

使用以下jq命令实现分组累加:

jq 'reduce .[] as $path ({};
  ($path | capture("(?<key>[^/]*/[^/]*)").key) as $groupKey;
  .[$groupKey] += [$path]
)'

命令说明

  • reduce .[] as $path ({}; ...):遍历数组中每个路径字符串,从空对象开始构建结果
  • ($path | capture("(?<key>[^/]*/[^/]*)").key):通过正则提取路径的前两段作为分组键
  • .[$groupKey] += [$path]:将当前路径追加到对应键的数组中,若键不存在则自动创建新数组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 08:27:49