В JQ получить массив на основе другого массива - PullRequest
0 голосов
/ 08 июня 2018

Я использую jq v1.5 .Учитывая ввод:

{
    "mine": [
        "foo",
        "baz"
    ],
    "stuff": {
        "foo": {
            "name": "Foo"
        },
        "bar": {
            "name": "Bar"
        },
        "baz": {
            "name": "Baz"
        },
        "qux": {
            "name": "Qux"
        }
    }
}

Как мне получить все .stuff.name s для .mine ?

Например, желаемый вывод:

[
    "Baz",
    "Foo"
]

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Используя простой фильтр jq и не обрабатывая другие оболочки, сделайте это, как показано ниже.

jq '[.mine[] as $in | .stuff[$in].name]'

Логика в основном заключается в индексировании значений из .mine и для каждой записи получают эквивалент .name значение в .stuff

jqplay - URL

0 голосов
/ 08 июня 2018

Решение.Я сохранил файл в / tmp / 1:

cat /tmp/1 | jq "[ .stuff | $(cat /tmp/1 | jq -r '.mine[]' | sed 's/^/./;s/$/.name/;' | tr '\n' ',' | sed 's/,$//') ]"

Сначала я получаю имена в .mine[], то есть foo и baz.Затем я конвертирую их в .foo.name, .baz.name и перехожу к jq [ .stuff | $(...) ], что приводит к [ .stuff | .foo.name, .baz.name ].

...