【问题标题】:JQ: group by into single object with groups as keysJQ:分组为单个对象,以组为键
【发布时间】:2022-09-29 18:04:19
【问题描述】:

我有以下数据:

[
  {
    \"company.u_ats_region\": \"Region1\",
    \"hostname\": \"host1\",
    \"install_status\": \"1\",
    \"os\": \"Windows\",
    \"os_domain\": \"test.com\"
  },
  {
    \"company.u_ats_region\": \"Region2\",
    \"hostname\": \"host2\",
    \"install_status\": \"1\",
    \"os\": \"Windows\",
    \"os_domain\": \"test.com\"
  },
  {
    \"company.u_ats_region\": \"Region3\",
    \"hostname\": \"host3\",
    \"install_status\": \"7\",
    \"os\": \"Windows\",
    \"os_domain\": \"test.com\"
  }
]

我一直在使用这个查询

{count: length,
 regions: [group_by(.\"company.u_ats_region\")[] | 
          {( [0].\"company.u_ats_region\"): [.[] | 
          {name: (.hostname+\".\"+.os_domain), 
      os: .os}]}]}

将数据转换为以下内容:

{
  \"count\": 3,
  \"regions\": [
    {
      \"Region1\": [
        {
          \"name\": \"host1.test.com\",
          \"os\": \"Windows\"
        }
      ]
    },
    {
      \"Region2\": [
        {
          \"name\": \"host2.test.com\",
          \"os\": \"Windows\"
        }
      ]
    },
    {
      \"Region3\": [
        {
          \"name\": \"host3.test.com\",
          \"os\": \"Windows\"
        }
      ]
    }
  ]
}

这接近我试图实现的目标,但我希望 \'regions\' 成为单个对象,每个区域都是该对象中的一个键,如下所示:

{
  \"count\": 3,
  \"regions\": {
      \"Region1\": [
        {
          \"name\": \"host1.test.com\",
          \"os\": \"Windows\"
        }
      ],
      \"Region2\": [
        {
          \"name\": \"host2.test.com\",
          \"os\": \"Windows\"
        }
      ],
      \"Region3\": [
        {
          \"name\": \"host3.test.com\",
          \"os\": \"Windows\"
        }
      ]
    }
}

我尝试过使用“添加”,但这仍然没有让我更接近我想要达到的结果。任何帮助表示赞赏!

  • 您提供的脚本不会为我生成声明的输出,但会导致错误。看起来它在[0] 之前缺少.。应该是:.[0].\"company.u_ats_region\"

标签: json group-by jq


【解决方案1】:

使用keyvalue 字段创建对象,然后使用from_entries 将是一种方法:

{
  count: length,
  regions: group_by(."company.u_ats_region")
  | map({
      key: .[0]."company.u_ats_region",
      value: map({name: "\(.hostname).\(.os_domain)", os})
    })
  | from_entries
}
{
  "count": 3,
  "regions": {
    "Region1": [
      {
        "name": "host1.test.com",
        "os": "Windows"
      }
    ],
    "Region2": [
      {
        "name": "host2.test.com",
        "os": "Windows"
      }
    ],
    "Region3": [
      {
        "name": "host3.test.com",
        "os": "Windows"
      }
    ]
  }
}

Demo

【讨论】:

    【解决方案2】:

    使用reduce 迭代构建数组将是另一种方式:

    {
      count: length,
      regions: (
        reduce .[] as $i ({};
          .[$i."company.u_ats_region"] += [$i | {name: "\(.hostname).\(.os_domain)", os}]
        )
      )
    }
    
    {
      "count": 3,
      "regions": {
        "Region1": [
          {
            "name": "host1.test.com",
            "os": "Windows"
          }
        ],
        "Region2": [
          {
            "name": "host2.test.com",
            "os": "Windows"
          }
        ],
        "Region3": [
          {
            "name": "host3.test.com",
            "os": "Windows"
          }
        ]
      }
    }
    

    Demo

    【讨论】:

      【解决方案3】:

      您可以定义一个执行分组然后转换结果的函数。使用函数可以避免重复选择器:

      def group_to_obj(f):
        group_by(f) | map({key:first|f, value:.}) | from_entries;
      
      {
        count: length,
        regions: group_to_obj(."company.u_ats_region")
          | map_values(map({name: "\(.hostname).\(.os_domain)", os}))
      }
      

      输出:

      {
        "count": 3,
        "regions": {
          "Region1": [
            {
              "name": "host1.test.com",
              "os": "Windows"
            }
          ],
          "Region2": [
            {
              "name": "host2.test.com",
              "os": "Windows"
            }
          ],
          "Region3": [
            {
              "name": "host3.test.com",
              "os": "Windows"
            }
          ]
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多