У меня такой ввод:
{ "prop": ["apple", "banana"] }
{ "prop": ["kiwi", "banana"] }
{ "prop": ["cherry", "orange"] }
Как печатать объекты, в которых реквизит содержит хотя бы один из киви и апельсин?
(Список интересных значений длиннее, чем просто 2, поэтому я хотел бы как-то использовать функцию any
.)
Я пробовал следующее
jq 'select(any(.prop[] | contains(["kiwi", "orange"])))' < input.json
и различные варианты вышеперечисленного, но не могу подобрать правильные выражения.
Я думаю, вы ищете IN/2 . Это реализовано с помощью любого, но его гораздо легче понять.
select(IN(.prop[]; "kiwi", "orange"))
Потоковую версию встроенной функции 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[]) ))