基于s_Group合并servers与groups数组并保留所有服务器项
基于
s_Group合并groups属性到servers数组的解决方案 需求:基于s_Group字段,将groups数组中匹配项的所有属性合并到servers数组的对应元素中,同时保留所有服务器条目。原使用的jq命令仅返回两个数组的公共项,还出现异常条目,需要修正。
输入数据
{ "servers": [ { "location": "srv_apc1", "f_Group": "auc-1" }, { "location": "srv_apc2", "f_Group": "auc-1", "c_Group": "c1" }, { "location": "srv_apc3", "f_Group": "auc-1", "c_Group": "c2" }, { "location": "srv_apc4", "f_Group": "auc-1", "c_Group": "c3" }, { "location": "srv_wc1", "s_Group": "cb-1" }, { "location": "srv_wc2", "s_Group": "cb-2" }, { "location": "srv_wc3", "s_Group": "cb-3" }, { "location": "srv_wc4", "s_Group": "cb-4" } ], "groups": [ { "s_Group": "cb-1", "options": [ "opt1", "opt3", "opt5", "home" ] }, { "s_Group": "cb-2", "options": [ "opt2", "opt4", "opt6", "home" ] }, { "s_Group": "cb-3", "options": [ "opt7", "opt8", "opt9", "home", "print" ] }, { "s_Group": "cb-4", "options": [ "ems99", "erec98", "expr-77", "home" ] }, { "s_Group": "extra-99", "options": [ "conf1", "ems34", "erec1", "home", "chec99", "franT" ] } ] }
原错误命令
.servers + .groups | group_by(.s_Group) | map(add)
错误原因:该命令将servers和groups的元素混合后按s_Group分组,无s_Group的服务器会被归为同一组合并,导致丢失原始服务器条目;同时groups中未匹配的extra-99条目也会被保留,不符合需求。
正确单步jq命令
.groups | reduce .[] as $g ({}; .[$g.s_Group] = $g) as $groupMap | {servers: [[.servers | map(. + ($groupMap[.s_Group] // {}))]]}
命令解释
- 先将
groups数组转换为以s_Group为键、对应group对象为值的映射表$groupMap; - 遍历
servers数组的每个元素,将元素与$groupMap中匹配s_Group的对象合并(无匹配时合并空对象,保留原元素不变); - 将处理后的
servers数组再嵌套一层,包装为指定输出结构。
多步骤处理方案(适合复杂场景)
步骤1:提取groups为映射文件
jq '.groups | reduce .[] as $g ({}; .[$g.s_Group] = $g)' input.json > group_map.json
步骤2:使用映射表处理servers
jq --argfile groupMap group_map.json '{servers: [[.servers | map(. + ($groupMap[.s_Group] // {}))]]}' input.json
期望输出
{ "servers": [ [ { "location": "srv_apc1", "f_Group": "auc-1" }, { "location": "srv_apc2", "f_Group": "auc-1", "c_Group": "c1" }, { "location": "srv_apc3", "f_Group": "auc-1", "c_Group": "c2" }, { "location": "srv_apc4", "f_Group": "auc-1", "c_Group": "c3" }, { "location": "srv_wc1", "s_Group": "cb-1", "options": [ "opt1", "opt3", "opt5", "home" ] }, { "location": "srv_wc2", "s_Group": "cb-2", "options": [ "opt2", "opt4", "opt6", "home" ] }, { "location": "srv_wc3", "s_Group": "cb-3", "options": [ "opt7", "opt8", "opt9", "home", "print" ] }, { "location": "srv_wc4", "s_Group": "cb-4", "options": [ "ems99", "erec98", "expr-77", "home" ] } ] ] }
内容的提问来源于stack exchange,提问作者Jim Hastings
相关产品推荐
相关产品推荐

