在JSON中使用jq过滤键



我有一个复杂的嵌套json

{
...
"key1": {
"key2" : [
{ ...
"base_score" :4.5
}
]
"key3": {
"key4": [
{ ...
"base_score" : 0.5 
...
}
]
}
...
}
}

可能有多个"base_score"在json("base_score"路径是未知的),相应的值将是一个数字,我必须检查是否至少有一个这样的值大于某个已知值7.0,如果有,我必须执行&;exit 1&;。我必须在shell脚本中编写这个查询。

假设输入是名为input的文件中的有效JSON。Json,然后根据我对需求的理解,您可以使用:

jq --argjson limit 7.0 '
any(.. | select(type=="object" and (.base_score|type=="number")) | .base_score; . > $limit)
| halt_error(if . then 1 else 0 end)
' input.json

您可以修改参数halt_error来设置退出码。

请注意,halt_error将其输入重定向到stderr,因此您可能需要将2> /dev/null(或适合您的shell的等效表达式)附加到上述调用中。

您可以轻松地获得任何级别的base_score值流,并将其与any一起使用:

any(..|.base_score?; . > 7)

流将包含没有该属性的对象的null值,但null不大于任何数字,因此不应成为阻止。

您可以比较输出或指定-e/--exit-status直接与条件一起使用:

jq -e 'any(..|.base_score?; . > 7)' complexnestedfile.json >/dev/null && exit 1

相关内容

  • 没有找到相关文章

最新更新