使用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
相关产品推荐
相关产品推荐

