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

基于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] // {}))]]}

命令解释

  1. 先将groups数组转换为以s_Group为键、对应group对象为值的映射表$groupMap;
  2. 遍历servers数组的每个元素,将元素与$groupMap中匹配s_Group的对象合并(无匹配时合并空对象,保留原元素不变);
  3. 将处理后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:01:07