我的数据是一系列 JSON 数组。每个数组都有一个或多个带有 name 和 id 键的元素:
[
{
"name": "first_source",
"id": "abcdef"
},
{
"name": "second_source",
"id": "ghijkl"
},
{
"name": "third_source",
"id": "opqrst"
}
]
如何使用 jq 只选择包含“first source”作为名称值的元素但不包含“second_source”作为任何元素的名称值的数组?
这只会返回一个元素以供进一步处理:
jq '.[] | select (.name == "first_source")
但我显然需要返回整个数组才能让我的场景工作。
最佳答案
您可以使用此过滤器:
select(
(map(.name == "first_source") | any) and
(map(.name != "second_source") | all)
)
您需要测试数组的所有元素是否存在名称。您可以通过将每个对象映射到您的条件并使用
any
来做到这一点。或 all
适当过滤。在这里,您想查看是否有任何项目名为
"first_source"
并且所有项目都没有命名 "second_source"
.
关于arrays - jq:只选择一个包含元素 A 但不包含元素 B 的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29429107/