В jq, как выбрать объекты, в которых массив содержит хотя бы одно значение (пересечение не пустое)

У меня такой ввод:

{ "prop": ["apple", "banana"] }
{ "prop": ["kiwi", "banana"] }
{ "prop": ["cherry", "orange"] }

Как печатать объекты, в которых реквизит содержит хотя бы один из киви и апельсин?

(Список интересных значений длиннее, чем просто 2, поэтому я хотел бы как-то использовать функцию any.)

Я пробовал следующее

jq 'select(any(.prop[] | contains(["kiwi", "orange"])))' < input.json

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

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
0
1 630
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, вы ищете IN/2 . Это реализовано с помощью любого, но его гораздо легче понять.

select(IN(.prop[]; "kiwi", "orange"))

Online demo

Ответ принят как подходящий

Потоковую версию встроенной функции any проще всего использовать, если помнить о ее сигнатуре:

def any(generator; condition):

Итак, нас ведут к:

select( any( .prop[]; . == "kiwi" or . == "orange" ))

или более кратко:

select( any(.prop[]; IN("kiwi", "orange")))

белый список

Если интересующие значения представлены в виде массива JSON, скажем, $whitelist, вы можете настроить вышеприведенное, заменив $whitelist[] явный поток значений:

select( any(.prop[]; IN($whitelist[]) ))

Другие вопросы по теме