jq - 如何计算某个值出现的次数?

标签 jq counting

我发现了以下方法来计算任意结构的 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/

相关文章:

algorithm - 查找小于或等于 n 且其二进制表示中没有连续 '1' 的正整数的数量

json - 在Bash中使用jq按对象属性值的长度降序对它们进行排序

json - jq 合并两个 json 文件并在合并文件中为每个文件创建一个键作为文件名

javascript - 计算多维数组中的元素

java - 如何查找字符串中的字符总数?

java - 输出字符串中元音数量最多的单词

linux - 解析错误 : Invalid numeric literal at EOF at line 1, 列 10897

json - 用 jq 遍历 json

json - 使用 jq 从每个主要节点版本获取最新版本

c++ - Boost中irange和counting_range的区别