Получить значения ключа, используя jq из json - PullRequest
2 голосов
/ 13 марта 2019

Я ищу способ найти полный путь к ключу для данного значения, взятого из переменной.Мои данные получены из результата запросаasticsearch.

Например, я хочу полный путь к значению ключа: 9i6O4ERWWB Значение ключа всегда уникально, и меняются только ключи example.com и template1 (я не могу предсказать, что будетимя).

После определения пути к ключу: _source.example.com.template1 Я хочу увеличить поле «counter» и обновить документasticsearch.

Мой ввод JSON:

{
    "_index": "domains",
    "_type": "doc",
    "_id": "c66443eb1e6a0850b03a91fdb967f4d1",
    "_score": 2.4877305,
    "_source": {
        "user_id": "c66443eb1e6a0850b03a91fdb967f4d1",
        "statistics": {
            "test_count": 0,
            "datasize": 0,
            "example.com": {
                "template1": {
                    "image_id": "iPpDWbaO3YTIEb0pBkW3.png",
                    "link_id": "4ybOOUJpaBpDaLxPkz1j.html",
                    "counter": 0,
                    "subdomain_id": "9i6O4ERWWB"
                },
                "template2": {
                    "image_id": "iPpDWasdas322sdaW3.png",
                    "link_id": "4ybOOd3425sdfsz1j.html",
                    "counter": 1,
                    "subdomain_id": "432432sdxWWB"
                }
            },
            "example1.com": {
                "template1": {
                    "image_id": "iPpDWdasdasdasdas3.png",
                    "link_id": "4ybOOUadsasdadsasd1j.html",
                    "subdomain_id": "9i6O4ERWWB"
                }
            }
        }
    }
}

То, что я пробовал, было:

<myfile jq -c 'paths | select(.[-1])
<myfile jq -c 'paths | select(.[-1] == "subdomain_id")'

, но при этом выводятся все значения ключа:

["_index"]
["_type"]
["_id"]
["_score"]
["_source"]
["_source","user_id"]
["_source","statistics"]
["_source","statistics","test_count"]
["_source","statistics","datasize"]
["_source","statistics","example.com"]
["_source","statistics","example.com","template1"]
["_source","statistics","example.com","template1","image_id"]
["_source","statistics","example.com","template1","link_id"]
["_source","statistics","example.com","template1","subdomain_id"]
["_source","statistics","template2"]
["_source","statistics","template2","image_id"]
["_source","statistics","template2","link_id"]
["_source","statistics","template2","subdomain_id"]
["_source","statistics","example1.com"]
["_source","statistics","example1.com","template1"]
["_source","statistics","example1.com","template1","image_id"]
["_source","statistics","example1.com","template1","link_id"]
["_source","statistics","example1.com","template1","subdomain_id"]

Мой псевдокод, который я пытаюсь написать:

seeked_key_value="432432sdxWWB"
jq -n --arg seeked_key_value "$seeked_key_value" \
'paths | select(.[-1].$seeked_key_value'

Ожидаемый результат: ["_source","statistics","example.com","template1","subdomain_id":"432432sdxWWB"]

Это выполнимо с jq в bash?

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Лучше избегать grep в подобных случаях. Чтобы соответствовать точным требованиям в настоящем деле, можно написать:

jq -c 'paths(scalars) as $p
| [$p, getpath($p)]
| select(.[1] == "9i6O4ERWWB")' input.json

Если кто-то действительно нуждается в grep-подобной функциональности, вы всегда можете использовать jq test/1.

0 голосов
/ 13 марта 2019

Вы можете «извлечь» пути, используя следующее:

jq -c 'paths(scalars) as $p | [$p, getpath($p)]' file.json | grep 432432sdxWWB

и ответ:

[["_source","statistics","example.com","template2","subdomain_id"],"432432sdxWWB"]

Возможно, вы можете улучшить jq-запрос, чтобы получить только одно значение, но я надеюсь, что этопоможет вам в определении окончательной версии:)

...