我想创建一个json对象,以json格式的字符串列表开始,如下所示

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

我想要得到的是字符串列表的映射,它将列表中字符串的前两个单词作为键,并将以该特定键开头的字符串作为值.

我试过以下几种方法:

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

并获得:

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

我期待着:

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

推荐答案

使用+=将数组相加.如果密钥不存在,JQ会动态创建(null + []的计算结果为[]):

reduce (.[] | capture("^(?<env>(?<type>[^/]*/[^/]*).*)$")) as {$env, $type} 
({}; .[$type] += [$env])
{
  "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"
  ]
}

Demo

Json相关问答推荐

使用相同的密钥值来命名Json并使用Jolt重命名密钥

您可以使用Jolt对JSON执行OR条件吗

将JSON输入子数组转换为字符串顺序列表输出

如何在改装Android中将ResponseBody转换为JSONObject

基于 JSON 字段的 Jolt 条件标志

如何避免解析 ISuperObject 类型字段中的 json 对象

如何将属性拆分为嵌套的JSON内容?

如何修复通过在 tsconfig.json 文件中添加allowImportingTsExtensions引发的错误 TS5023?

如何在JQ中展平多维数组

Golang gin接收json数据和图片

NiFi 使用嵌套数组将 avro 转换为 JSON 数组格式

JSONPath:查找子项目条件在字符串列表中的项目

golang递归json来构造?

避免 KeyError 的默认字典键

将错误消息作为 JSON 对象发送

使用 gson 反序列化对象的特定 JSON 字段

如何使用 Jackson 重命名 JSON 序列化中的根键

android - 在 adb logcat 输出中格式化 json 字符串

有 Json 标签但未导出

如何遍历 JSON 中的条目?