如果任何嵌套值与设置值匹配,则打印键

时间:2020-02-14 16:40:17

标签: json jq

最好用预期的输入和输出来解释。

输入以下内容:

{
  "27852380038": {
    "compute_id": 34234234,
    "to_compute": [
      {
        "asset_id": 304221854,
        "new_scheme": "mynewscheme",
        "original_host": "oldscheme1234.location.com"
      },
      {
        "asset_id": 12123121,
        "new_scheme": "myotherscheme",
        "original_host": "olderscheme1234.location.com"
      }
    ]
  },
  "31352333022": {
    "compute_id": 43888877,
    "to_compute": [
      {
        "asset_id": 404221555,
        "new_scheme": "mynewscheme",
        "original_host": "oldscheme1234.location.com"
      },
      {
        "asset_id": 52123444,
        "new_scheme": "myotherscheme",
        "original_host": "olderscheme1234.location.com"
      }
    ]
  }
}

然后我正在搜索的asset_id 12123121的输出应该是:

27852380038

因此,我希望asset_id中的任何to_compute与我的输入asset_id匹配的顶级键。

到目前为止,我还没有看到任何将嵌套访问与任何测试(如果有的话)相结合的jq示例。

2 个答案:

答案 0 :(得分:2)

无需使用环境变量即可完成任务

< input.json jq -r --argjson ASSET_ID 12123121 '
  to_entries[]
  | {key, asset_id: .value.to_compute[].asset_id}
  | select(.asset_id==$ASSET_ID)
  | .key'

或更有效地使用过滤器:

to_entries[]
| select( any( .value.to_compute[]; .asset_id==$ASSET_ID) )
| .key

答案 1 :(得分:1)

在同事的帮助下,我得以弄清楚:

$ export ASSET_ID=12123121
$ cat input.json | jq -r "to_entries[] | .value.to_compute[] + {job: .key} | select(.asset_id==$ASSET_ID) | .job"
27852380038