Как выбрать несколько ключей с помощью JQ - PullRequest
0 голосов
/ 13 ноября 2018

Как jq извлечь как ключ index, так и ключ doctype на основе атрибута dynamic?:

{
    "index1": {
        "mappings": {
            "doctype1": {
                "dynamic": "true"
            },
            "doctype2": {
                "dynamic": "static"
            }
        }
    },
    "index2": {
        "mappings": {
            "doctype3": {
                "dynamic": "static"
            },
            "doctype4": {
                "dynamic": "true"
            }
        }
    }
}

дать:

{
    "index1": {
        "doctype2": { "dynamic": "static" }
    },
    {
    "index2": {
        "doctype3": { "dynamic": "static" }
    }
}

или

{
    "index1": "['doctype2']",
    "index2": "['doctype3']"
}

Я пытался:

jq '. | keys as $i | .[].mappings | keys as $d | $i $d'

но это даже не близко

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Для получения вывода в первой форме:

map_values( .mappings
            | with_entries( select( .value.dynamic == "static" )) )

Мы используем map_values, поскольку в качестве входных данных используется объект JSON, и мы хотим сохранить его ключи; мы используем with_entries, поскольку это позволяет легко выбирать интересующие вас ключи.

Приведенный выше фильтр можно легко настроить для получения выходных данных во второй форме, но эта форма немного странная и, возможно, не поощряется, поэтому я не буду.

0 голосов
/ 13 ноября 2018

Вы можете попробовать эти фильтры:

Для первого выхода:

jq '[
      tostream|
      select(.[1]=="static" and (.[0]|.[-1] == "dynamic"))|
      {(.[0]|.[0]):{(.[0]|.[2]):{(.[0]|.[3]):.[1]}}}
    ]|add' file

А для второго:

jq '[
      tostream|
      select(.[1]=="static" and (.[0]|.[-1] == "dynamic"))|
      {(.[0]|.[0]):[(.[0]|.[2])]}
    ]|add' file

Оба фильтра работают на tostreamфункция (требуется не менее jq версии 1.5), которая выдает содержимое ввода в массив в виде [path[],value].

Функция select получает все пути, заканчивающиеся dynamic и static.

3-я часть фильтра подделывает новый объект в соответствии с ожидаемым выводом путем поиска пути массива.

...