首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据键值对对象进行备份和分组

如何根据键值对对象进行备份和分组
EN

Stack Overflow用户
提问于 2021-12-29 17:00:24
回答 1查看 44关注 0票数 0

我是新手,这是我的第一步。我想我是从一个不简单的案子开始的。

让我们看看:我有一个带有ID (name)和一个资源组(rgs)的对象。每个对象可能是几个组的一部分。而真正需要的是得到这些群体的交叉点。

重要的是,对象可能是几个组的一部分,这些组是父-子组,我只需要得到父组。当括号共享前缀时,很容易识别它们。

例如,组PROM_FD_ARCNA包含子组PROM_FD_ARCNA_TGMPROM_FD_ARCNA_TGM_TGA。子组包含对象本身。但是,只要我能从对象那里得到信息,它就结束了。

父组是PROM_FD_ARCNAPROM_JOB_ICMPPROM_JOB_WIN。也就是说,我需要得到那些属于这些组的交叉点的对象。

JSON文件,它看起来像:

代码语言:javascript
复制
[
    {
        "id_ci": "487006",
        "name": "LABTNSARWID625",
        "id_ci_class": "host",
        "rgs": "PROM_FD_ARCNA, PROM_FD_ARCNA_TGM, PROM_FD_ARCNA_TGM_TGA"
    },
    {
        "id_ci": "5706",
        "name": "HCCQ2001",
        "id_ci_class": "host",
        "rgs": "PROM_JOB_ICMP"
    },
    {
        "id_ci": "9106",
        "name": "HCC02155",
        "id_ci_class": "host",
        "rgs": "PROM_FD_ARCNA, PROM_FD_ARCNA_TGA, PROM_JOB_ICMP"
    },
    {
        "id_ci": "2306",
        "name": "VM00006",
        "id_ci_class": "host",
        "rgs": "PROM_FD_ARCNA, PROM_FD_ARCNA_TGA, PROM_JOB_WIN, PROM_JOB_WIN_TGA"
    }
]

如果我的解释不好,我需要得到这样的JSON:

代码语言:javascript
复制
PROM_FD_ARCNA, PROM_JOB_ICMP
{
"HCC02155"
}

PROM_FD_ARCNA, PROM_JOB_WIN 
{
"VM00006"
}

因为这些是交叉口。

到目前为止,我试过这个:

代码语言:javascript
复制
jq '[.[] | select(.id_ci_class == "host") | select (.rgs | startswith("PROM_FD_ARCNA")) | .rgs = "PROM_FD_ARCNA"] 
| group_by(.rgs) | map({"rgs": .[0].rgs, "Hosts": map(.name)}) '  ./prom_jobs.json >> Step0A.json 
代码语言:javascript
复制
jq '[.[] | select(.id_ci_class == "host") | select (.rgs | startswith("PROM_JOB_WIN")) | .rgs = "PROM_JOB_WIN"] 
| group_by(.rgs) | map({"rgs": .[0].rgs, "Hosts": map(.name)}) '  ./prom_jobs.json >> Step0A.json 
代码语言:javascript
复制
jq '[.[] | select(.id_ci_class == "host") | select (.rgs | startswith("PROM_JOB_ICMP")) | .rgs = "PROM_JOB_ICMP"] 
| group_by(.rgs) | map({"rgs": .[0].rgs, "Hosts": map(.name)}) '  ./prom_jobs.json >> Step0A.json

结果是:

代码语言:javascript
复制
[
  {
    "rgs": "PROM_FD_ARCNA",
    "Hosts": [
      "LABTNSARWID625",
      "HCC02155",
      "VM00006"
    ]
  }
]
[
  {
    "rgs": "PROM_JOB_WIN",
    "Hosts": [
      "VM00006"
    ]
  }
]
[
  {
    "rgs": "PROM_JOB_ICMP",
    "Hosts": [
      "HCCQ2001",
      "HCC02155"
    ]
  }
]

当然,完整的JSON相当长,我需要尽可能轻量级地处理它。不知道我一开始是好是坏。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-29 19:03:45

代码语言:javascript
复制
def to_set(s): reduce s as $_ ( {}; .[ $_ ] = true );

[ "PROM_FD_ARCNA", "PROM_JOB_ICMP", "PROM_JOB_WIN" ] as $roots |

map(
   {
      name,
      has_rg: to_set( .rgs | split( ", " )[] )
   }
) as $hosts |

[
   range( 0;    $roots | length ) as $i |  $roots[ $i ] as $g1 |
   range( $i+1; $roots | length ) as $j |  $roots[ $j ] as $g2 |
   {
      root_rgs: [ $g1, $g2 ],
      names: [
         $hosts[] |
         select( .has_rg[ $g1 ] and .has_rg[ $g2 ] ) |
         .name
      ]
   } |
   select( .names | length > 0 )
]

产生

代码语言:javascript
复制
[
  {
    "root_rgs": [
      "PROM_FD_ARCNA",
      "PROM_JOB_ICMP"
    ],
    "names": [
      "HCC02155"
    ]
  },
  {
    "root_rgs": [
      "PROM_FD_ARCNA",
      "PROM_JOB_WIN"
    ],
    "names": [
      "VM00006"
    ]
  }
]

jqplay上的演示

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70522587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档