在 jq 中,如何 select 数组包含至少一个值的对象(交集非空)
In jq, how to select objects where an array contains at least one value (intersection non-empty)
我有这样的输入:
{ "prop": ["apple", "banana"] }
{ "prop": ["kiwi", "banana"] }
{ "prop": ["cherry", "orange"] }
如何打印 prop 至少包含奇异果和橙子其中之一的对象?
(有趣的值列表不止 2 个,所以我想以某种方式利用 any
函数。)
我尝试了以下方法
jq 'select(any(.prop[] | contains(["kiwi", "orange"])))' < input.json
以及上述的各种变体,但无法找出正确的表达方式。
我认为您正在寻找 IN/2
. It's implemented using any
,但更容易掌握。
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[]) ))
我有这样的输入:
{ "prop": ["apple", "banana"] }
{ "prop": ["kiwi", "banana"] }
{ "prop": ["cherry", "orange"] }
如何打印 prop 至少包含奇异果和橙子其中之一的对象?
(有趣的值列表不止 2 个,所以我想以某种方式利用 any
函数。)
我尝试了以下方法
jq 'select(any(.prop[] | contains(["kiwi", "orange"])))' < input.json
以及上述的各种变体,但无法找出正确的表达方式。
我认为您正在寻找 IN/2
. It's implemented using any
,但更容易掌握。
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[]) ))