【问题标题】:How combine multiple output objects into a single object with jq如何使用 jq 将多个输出对象组合成一个对象
【发布时间】:2018-09-15 18:03:41
【问题描述】:

我正在尝试解析 terraform 状态文件的输出。

{
    "version": 3,
    "terraform_version": "0.9.3",
    "serial": 0,
    "lineage": "ae1f2572-8fa6-4977-be73-3deac7529eff",
    "modules": [
        {
            "path": [
                "root"
            ],
            "outputs": {
                "elb_dns_name": {
                    "sensitive": false,
                    "type": "string",
                    "value": "web-elb-1019323532.us-east-1.elb.amazonaws.com"
                }
            },
            "resources": {},
            "depends_on": []
        },
        {
            "path": [
                "root",
                "elb"
            ],
            "outputs": {
                "dns_name": {
                    "sensitive": false,
                    "type": "string",
                    "value": "web-elb-1019323532.us-east-1.elb.amazonaws.com"
                }
            },
            "depends_on": []
        },
        {
            "path": [
                "root",
                "sg"
            ],
            "outputs": {
                "security_group_id": {
                    "sensitive": false,
                    "type": "string",
                    "value": "sg-5a677425"
                }
            },
            "depends_on": []
        },
        {
            "path": [
                "root",
                "web"
            ],
            "outputs": {
                "web_instance_ids": {
                    "sensitive": false,
                    "type": "string",
                    "value": "i-03676fa6ba43fbb9f,i-09f51a313146856cd"
                },
                "web_public_ips": {
                    "sensitive": false,
                    "type": "string",
                    "value": "34.207.194.186,34.203.236.205"
                }
            },
            "depends_on": []
        }
    ]
}

我想取回一个 json 对象,其中输出名称是键,值是输出值。就像在这个例子中......

{
  "elb_dns_name": "web-elb-1019323532.us-east-1.elb.amazonaws.com",
  "dns_name": "web-elb-1019323532.us-east-1.elb.amazonaws.com",
  "security_group_id": "sg-5a677425",
  "web_instance_ids": "i-03676fa6ba43fbb9f,i-09f51a313146856cd",
  "web_public_ips": "34.207.194.186,34.203.236.205"
}

我只能用这个.modules[] | .outputs | to_entries | map({(.key) : .value.value }) | add取回单个对象

{
  "elb_dns_name": "web-elb-1019323532.us-east-1.elb.amazonaws.com"
}
{
  "dns_name": "web-elb-1019323532.us-east-1.elb.amazonaws.com"
}
{
  "security_group_id": "sg-5a677425"
}
{
  "web_instance_ids": "i-03676fa6ba43fbb9f,i-09f51a313146856cd",
  "web_public_ips": "34.207.194.186,34.203.236.205"
}

所以由于某种原因我不能发帖,因为 stackoverflow 说我有太多代码而没有足够的细节......所以现在我正在做一个日记条目,以便输入足够多的内容以便我可以点击提交按钮。 .. 任何一分钟... 现在任何数量的字符...

好的,所以当我不在工作中构建代码管道时,我真的很喜欢玩 dota2。只有我觉得我很糟糕。我的意思是我在游戏中玩了 1200 个小时,但我仍然像 1.5k MMR 垃圾一样。

【问题讨论】:

  • 代码不要太多,数据不要太多。您希望读者通过您的整个问题数据集进行解析,此时应该可以在您包含的数据的 1/2、1/3、1/4 中证明您的问题。您应该阅读有关minimal reproducible example 的信息;-)。祝你好运。
  • @shellter 我认为这个案例需要包括整个数据集。如果您查看我正在尝试的查询以及我找到的解决方案,您会发现我必须从头开始。我本可以剪掉大部分文本的资源键,但我不觉得包含整个对象是一件坏事,我仍然不这样做。

标签: json key transform jq


【解决方案1】:

使用map_values 会产生更简单(或至少更短)的过滤器,并且可能更有效:

.modules | map(.outputs | map_values(.value) ) | add

【讨论】:

    【解决方案2】:

    我最终找到了解决方案,但花费的时间比应有的时间长(数小时)。基本上,如果您在列表中丢失了,,那么您在某处搞砸了。

    这是我用的.modules | map(.outputs | to_entries[] | {(.key): .value.value}) | add

    它有效,但也许是更好的方法。

    【讨论】:

      猜你喜欢
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      • 1970-01-01
      • 2019-06-18
      • 2017-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多