Выбор элемента на основе поиска в массиве подэлементов возвращает элемент один раз для каждого соответствующего элемента в массиве. - PullRequest
0 голосов
/ 12 марта 2020

Учитывая json

{ "games": [
{
    "id":1,
    "files": [ "foo.mp4" ]
},
{
    "id":2,
    "files": [ "foo.ogv",  "bar.ogv" ]
},
{
    "id":3,
    "files": [ "bar.ogv" ]
}
]}

и команду jq -r '.games[] | select(.files[] | contains("ogv"))' foo.json, json выводит элемент один раз для каждого совпадения с ogv в массиве подэлементов. Как мне заставить jq выводить каждый соответствующий элемент только один раз?

Ответы [ 2 ]

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

Использование any будет более эффективным, чем полагаться на unique. Например,

jq -r '.games[] | select(any(.files[]; test("ogv")))'
0 голосов
/ 12 марта 2020
jq -r '[.games[] | select(.files[] | contains("ogv"))] | unique | .[]' foo.json

или, поскольку я действительно хочу только id,

jq -r '[.games[] | select(.files[] | contains("ogv")) | .id] | unique | .[]' foo.json
...