Узнать родительский ключ, когда определенное дочернее значение встречается с jq - PullRequest
1 голос
/ 25 мая 2020

Вот json:

{
    "vendors": {
        "vendor1": {
            "vendor_version": "LS TT1706-POL",
            "vendor_name": "toyota"
        },
        "vendor2": {
            "vendor_version": "LSGS-2002-RC",
            "vendor_name": "honda"
        },
        "vendor3": {
            "vendor_version": "LS1903",
            "vendor_name": "suzuki"
        }
    }
}

Мне в основном нужно выражение jq, чтобы получить "vendor2", когда мне дают LSGS-2002-R C. Я пробовал использовать select, map, переменные и все их комбинации. вот что-то, что не сработало:

jq -r '.vendors|to_entries[]|.value|select(.vendor_version=="LSGS-2002-RC")'

Обычно я всегда получаю ключи vendor1, vendor2, et c ... stripped

Я немного в тупике. Обратите внимание, что структура или значения json не могут быть изменены. Спасибо

1 Ответ

1 голос
/ 25 мая 2020

У вас это почти получилось, но правильный фильтр должен был заключаться в использовании функции select() на .value.vendor_version и выборе имени ключа

jq -r '.vendors | to_entries[] | select(.value.vendor_version=="LSGS-2002-RC").key'

Также не передавайте динамические c строки функции, используйте заполнители, такие как переменные

jq -r --arg vendor "LSGS-2002-RC" '.vendors | to_entries[] | select(.value.vendor_version == $vendor).key'

Альтернативная, менее читаемая версия, чем select(), будет использовать keys[]

.vendors | keys[] as $k | if .[$k].vendor_version == "LSGS-2002-RC" then $k else empty end
...