Ключ печати, если любое вложенное значение соответствует заданному значению - PullRequest
3 голосов
/ 14 февраля 2020

Это лучше всего объяснить ожидаемым вводом и выводом.

Учитывая этот ввод:

{
  "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 s в to_compute соответствовал моему вводу asset_id.

Я не видел ни одного примера jq пока что совмещает вложенный доступ с любым тестом / если еще.

Ответы [ 2 ]

2 голосов
/ 15 февраля 2020

Задача может быть выполнена без использования переменных среды, например,

< 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 голос
/ 14 февраля 2020

С некоторой помощью коллеги я смог выяснить это:

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