我发现了以下方法来计算任意结构的 JSON 中的值:
{
cat <<EOF
{
"a": 3,
"b": 4,
"c": 3,
"d": {
"e": 3
},
"f": 6
}
EOF
} | jq '[..
| if type == "object"
then select(.value)
else .
end
] | map(select(. == 3)) | length'
是否有更短的方法在任意结构的 JSON 中递归计数?
我想知道是否需要使用walk
,但只能找到以下内容,不知道最后如何计算:
{
cat <<EOF
{
"a": 3,
"b": 4,
"c": 3,
"d": {
"e": 3
},
"f": 6
}
EOF
} | jq '..
| walk(if type == "object"
then to_entries
| map(select(.value))
| from_entries
else .
end
)
| (. == 3)'
产量:
false
true
false
true
false
true
false
最佳答案
您可以梳理流表示,过滤掉匹配的项目,并即时计数:
jq 'reduce tostream[1] as $v (0; if $v == 3 then .+1 else . end)'
同样,您可以使用 ..
递归迭代,并仅考虑标量
(或数字
):
jq 'reduce (.. | scalars) as $v (0; if $v == 3 then .+1 else . end)'
或者将条件移动到迭代生成器中,这样您就可以在主体中无条件计数:
jq 'reduce (.. | select(numbers == 3)) as $_ (0; .+1)'
关于jq - 如何计算某个值出现的次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76037803/