Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 使用jq通过搜索子键/值对来选择父项_Json_Bash_Select_Jq - Fatal编程技术网

Json 使用jq通过搜索子键/值对来选择父项

Json 使用jq通过搜索子键/值对来选择父项,json,bash,select,jq,Json,Bash,Select,Jq,使用,如果父对象包含满足两个筛选要求的子对象,如何选择该父对象 在本例中,我想选择所有子网元素,这些子网元素都有一个带有键“Name”和值“TheName”的子标记。我的示例有两个子网。第一个在错误的键中有“TheName”。第二个子网具有我要查找的名称/值对。i、 e.“键”:“名称”、“值”:“名称” 下面选择一个子网,该子网在其中一个标记中具有指定值,但在标记对中没有指定值。它返回两个子网,而不是仅返回第二个子网 jq '.Subnets[] | select(.Tags[].Value=

使用,如果父对象包含满足两个筛选要求的子对象,如何选择该父对象

在本例中,我想选择所有子网元素,这些子网元素都有一个带有键“Name”和值“TheName”的子标记。我的示例有两个子网。第一个在错误的键中有“TheName”。第二个子网具有我要查找的名称/值对。i、 e.
“键”:“名称”、“值”:“名称”

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

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"
        }
    ]
}
.Subnets[]
| select( any (.Tags[]; .Key == "Name" and .Value == "TheName") )

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

{
    "VpcId": "vpc-12345678",
    "SubnetId": "subnet-1234567b",
    "Tags": [
        {
            "Key": "IgnoreThis",
            "Value": "ignore"
        },
        {
            "Key": "Name",
            "Value": "TheName"
        }
    ]
}
.Subnets[]
| select( any (.Tags[]; .Key == "Name" and .Value == "TheName") )
这将生成您想要的输出,因此我不会在这里重复

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

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

p、 s.
any(str;cond)
可以理解为:“
e | cond
流中是否有任何元素str,使得
e | cond
的值不是
null
false
?”

<


与大多数编写良好的Unix命令一样,
jq
可以读取一个文件名参数,因此这是一个了不起的峰值!我不明白“任何”上的文件。jq上的文档和示例不是非常清晰。它需要更多这样的例子。希望问题标题能帮助其他人找到你的答案!