我有一个复杂的嵌套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