如何使用jq将子值聚合到数组中?

时间:2019-08-13 11:12:14

标签: json shell jq

我是jq的新手,并尝试将images键的值提取到新键中,这样

{
  "environments": {
    "staging": {
      "apps": {
        "web": {
          "image": "image1"
        }
      }
    },
    "production": {
      "apps": {
        "web": {
          "image": "image2"
        },
        "admin": {
          "image": "image3"
        }
      }
    }
  }
}

变成这样的东西:

{
  "environments": {
    "staging": {
      "images": [
        "image1"
      ]
    }
  },
  "production": {
    "images": [
      "image2",
      "image3"
    ]
  }
}

我已经摆弄jq已有一段时间了,有人能给我一个提示吗?

1 个答案:

答案 0 :(得分:1)

假设结果期望environments对象同时包含stagingproduction,则可以使用以下jq命令:

<file jq '.environments |= (.[] |= {images : (.apps|map(.[]))})'
{
  "environments": {
    "staging": {
      "images": [
        "image1"
      ]
    },
    "production": {
      "images": [
        "image2",
        "image3"
      ]
    }
  }
}

这将environments对象的内容替换为新的内部images对象,该对象包含appsimage引用的列表图像。

图像数组是使用内置的map()函数构建的。