如果字段值为“auto”,则选择键

如果字段值为“auto”,则选择键

我有一个正在尝试解析的 JSON 文件。如果字段的值为 ,我想选择键值auto。我应该得到输出为package2.我用来在 shelljq中解析 JSON bash

{
    "package1":{
        "name":"package_1",
        "value":"manual"
    },
    "package2":{
        "name":"package_2",
        "value":"auto"
    }
}

答案1

jq 'map_values(select(.value == "auto"))' file

...您提取您感兴趣的顶级对象的部分:

{
  "package2": {
    "name": "package_2",
    "value": "auto"
  }
}

使用map_values(expression),您可以应用于expression输入对象的每个子部分。在这种情况下,该部分是保留如果语句中的测试select()评估为真的,否则丢弃。它类似于map(expression),但您可以map()在数组和map_values()对象上使用。

从那里,您可以选择获取顶级密钥:

$ jq -r 'map_values(select(.value == "auto"))|keys[]' file
package2

keys函数创建输入对象中所有键的数组,最后[]将数组扩展为一组字符串。

请注意,如果有多个子对象作为auto.value键值,您将从该命令中获得多个字符串。


有那么一会儿,我不确定您是想要密钥的值.name还是顶级密钥。当我发现你只想要顶级密钥时,我已经写了下面的文字。我将其作为一种评论保留下来。

$ jq -r 'map_values(select(.value == "auto"))[].name' file
package_2

最后使用[].name,将顶级对象扩展为一组子对象,然后.name从每个子对象中提取键的值。

最后一个也可以写成

$ jq -r 'map_values(select(.value == "auto").name)[]' file
package_2

...这将原始对象减少到仅

{
  "package2": "package_2"
}

...然后提取带有尾随的所有剩余键的值[]

答案2

你可以使用jq选择()功能:

jq -r '.[] | select(.value=="auto").name'

另外,您的 json 示例当前无效。

相关内容