jq select 属性如果任何数组元素满足条件
jq select attribute if any array element satisfies a condition
在 jq 的帮助下,我想 select 至少有一个节点的所有地址 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 中还有一个 unique 关键字,但我不知道这对我有什么帮助。
使用unique
是安全的,但确实需要排序,这可能不是必需的。例如,在您的特定情况下,重复是 jq 查询的产物。考虑使用 any
代替(或同时使用),因为它更准确地捕捉了意图 ("at least one"),并且具有 "short-circuit" 语义(即,一旦条件为真,它就会停止搜索):
$ jq '.nodes[]
| select( any(.attributes[]; .required == true))
| .address' input.json
输出:
"127.0.0.1"
如有必要,您可以随时添加 unique
。
在 jq 的帮助下,我想 select 至少有一个节点的所有地址 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 中还有一个 unique 关键字,但我不知道这对我有什么帮助。
使用unique
是安全的,但确实需要排序,这可能不是必需的。例如,在您的特定情况下,重复是 jq 查询的产物。考虑使用 any
代替(或同时使用),因为它更准确地捕捉了意图 ("at least one"),并且具有 "short-circuit" 语义(即,一旦条件为真,它就会停止搜索):
$ jq '.nodes[]
| select( any(.attributes[]; .required == true))
| .address' input.json
输出:
"127.0.0.1"
如有必要,您可以随时添加 unique
。