gpt4 book ai didi

json - 使用 jq 通过搜索子键/值对来选择父级

转载 作者:行者123 更新时间:2023-11-29 08:53:21 25 4
gpt4 key购买 nike

使用 jq ,如果父对象包含满足两个过滤器要求的子对象,我该如何选择它?

在这个例子中,我想选择所有子网元素,这些元素有一个子标签,键为“Name”,值为“TheName”。我的示例有两个子网。第一个在错误的键中有“TheName”。第二个子网具有我要查找的名称/值对。即 "Key": "Name", "Value": "TheName"

以下选择在其中一个标签中具有指定值但不在标签对中具有指定值的子网。它返回两个子网,而不是仅返回第二个子网。

jq '.Subnets[] | select(.Tags[].Value=="TheName")' output

如何使用 jq 仅选择具有我要查找的名称/值对的子网?

{
"Subnets": [
{
"VpcId": "vpc-12345678",
"SubnetId": "subnet-1234567a",
"Tags": [
{
"Key": "IgnoreThis",
"Value": "TheName"
},
{
"Key": "Name",
"Value": "NotTheName"
}
]
},
{
"VpcId": "vpc-12345678",
"SubnetId": "subnet-1234567b",
"Tags": [
{
"Key": "IgnoreThis",
"Value": "ignore"
},
{
"Key": "Name",
"Value": "TheName"
}
]
}
]
}

期望的输出是:

{
"VpcId": "vpc-12345678",
"SubnetId": "subnet-1234567b",
"Tags": [
{
"Key": "IgnoreThis",
"Value": "ignore"
},
{
"Key": "Name",
"Value": "TheName"
}
]
}

最佳答案

假设你的 jq 有 any/2,一个简单有效的解决方案是:

.Subnets[]
| select( any (.Tags[]; .Key == "Name" and .Value == "TheName") )

这会产生你想要的输出,所以我不会在这里重复。

如果你的 jq 没有 any/2,我建议升级,但如果那不方便或不是一个选项,你可以使用这个 def:

def any(f;g): reduce f as $i (false; . or ($i|g));

附注any(str; cond) 可以读作:'在流 str 中是否有任何元素 e,使得 e|cond 的值不是 null 还是 false?'

关于json - 使用 jq 通过搜索子键/值对来选择父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39971324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com