【问题标题】:In jq, how to select objects where an array contains at least one value (intersection non-empty)在jq中,如何选择数组包含至少一个值的对象(交叉点非空)
【发布时间】:2020-12-10 10:09:00
【问题描述】:

我有这样的输入:

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

如何打印 prop 至少包含奇异果和橙色之一的对象?

(有趣的值列表不仅仅是 2 个,所以我想以某种方式利用 any 函数。)

我尝试了以下方法

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

以及上述的各种变体,但无法找出正确的表达方式。

【问题讨论】:

    标签: json select jq any


    【解决方案1】:

    如果记住它的签名,则内置函数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[]) ))
    

    【讨论】:

      【解决方案2】:

      我认为您正在寻找IN/2。这是implemented using any,但更容易掌握。

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

      Online demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-05
        • 2019-12-09
        • 2018-03-21
        • 2020-11-19
        • 1970-01-01
        • 2019-11-03
        • 1970-01-01
        相关资源
        最近更新 更多