【问题标题】:jq select attribute if any array element satisfies a conditionjq 如果任何数组元素满足条件,则选择属性
【发布时间】:2016-10-07 10:02:05
【问题描述】:

jq 的帮助下,我想选择属性列表中至少有一个 required=true 的节点的所有地址。结果列表应该有唯一的项目。

这是我的 Json:

{
"nodes": [
    {
        "address":"127.0.0.1",
        "attributes": [
            {
                "id":"abc",
                "required":true
            },
            {
                "id":"def",
                "required":true
            },
            {
                "id":"ghi",
                "required":false
            }
        ]
    },
    {
        "address":"127.0.0.2",
        "attributes": [
            {
                "id":"abc",
                "required":false
            },
            {
                "id":"def",
                "required":false
            }
        ]
    }
]
}

我第一次尝试:

jq '.nodes[] | select(.attributes[].required == true) | .address'

这会产生:

"127.0.0.1"
"127.0.0.1"

因此,它会获取在属性部分中找到的每个 required=true 字段的地址。如何使结果列表独一无二? jq 中还有一个独特的关键字,但我不知道这对我有什么帮助。

【问题讨论】:

    标签: json select jq any


    【解决方案1】:

    使用unique 是安全的,但它确实需要排序,这可能不是必需的。例如,在您的特定情况下,重复是 jq 查询的工件。考虑改用any(或同时使用),因为它更准确地捕捉了意图(“至少一个”),并且具有“短路”语义(即,一旦条件为真,它就会停止搜索):

    $ jq '.nodes[]
    | select( any(.attributes[]; .required == true))
    | .address' input.json
    

    输出:

    "127.0.0.1"
    

    如有必要,您可以随时添加unique

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 2015-11-03
      • 1970-01-01
      相关资源
      最近更新 更多