json - JQ - 按层次结构解析字段

标签 json bash addition jq

我有非常大的 json,我想使用 jq 从中提取数据总和。

我正在尝试一切可能的方法,但我认为我在这里遗漏了一些东西..

我的 Json 子集:

{"main":
  {"0": {"x": {"a":1}, "y": {"number of un-used":{"count":2} , "z":2}},
  "1": {"x": {"a":1}, "y": {"number of un-used":{"count":3} , "z":2}},
  "2": {"x": {"a":1}, "y": {"number of un-used":{"count":4} , "z":2}},
  "3": {"x": {"a":1}, "y": {"no un-used":{"z":3} , "z":2}},
  "4": {"x": {"a":1}, "y": {"no un-used":{"z":3} , "z":2}}},
 "no-main":
  {"0": {"x": {"a":1}, "y": {"number of un-used":{"count":2} , "z":2}},
  "1": {"x": {"a":1}, "y": {"number of un-used":{"count":3} , "z":2}},
  "2": {"x": {"a":1}, "y": {"number of un-used":{"count":4} , "z":2}},
  "3": {"x": {"a":1}, "y": {"no un-used":{"z":3} , "z":2}},
  "4": {"x": {"a":1}, "y": {"no un-used":{"z":3} , "z":2}}}}

我想要“y”下的“count”-“未使用的数量”的总和。

我最成功的一个是:

cat json | jq '.[] | .[].y | .["number of un-used"] | .count'

但是结果包含很多“null”,因为“未使用的数量”并不在所有“y”字典中。

可以解决吗?

最佳答案

您可以将零添加到空值以得到...零。

jq '.[] | .[].y | ."number of un-used" | .count + 0' < input.json

这会生成您要查找的 count 值列表,其中 null 值显示 0。将它们添加到您的总和中不应改变它。

jq 可以在其表达式中执行基本算术,但让它在内部计算总和会变得​​稍微复杂一些。虽然您可以定义使用 reduce 的函数,但通过在命令行中附加一些内容可能会更容易对这些值求和,如下所示:

| awk '{n+=$1}END{print n}'

当然,有无数种方法可以将数字相加,其中一些方法比其他方法更黑客。

$ { printf '%s+' $(jq '.[] | .[].y | ."number of un-used" | .count + 0' input.json); echo 0; } | bc
18

关于json - JQ - 按层次结构解析字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48205247/

相关文章:

python/flask/Jinja2 和 Json

javascript - 无法读取未定义的属性 'toLowerCase' (Angularjs/JavaScript/Json)

python - 如何将 PIL 图片复制到剪贴板

c - C语言中使用栈进行2个大数的加法

javascript - 如何获得最大和最小的数

javascript - 无法使用 JQuery(或仅使用 javascript)解析复杂的 JSON 响应

linux - 如何从包含 PID 列表的文件中检查进程是否处于事件状态?

python - 在 Bash shell 中,为什么 Python 仅在输出重定向或通过管道传输时才提示打印非 ascii 字符?

jquery - 在 jQuery Serialize() 或 SerializeArray() 中向 Ajax POST 添加/push() 值

python - 要求用户输入数字并输出总和以及输入数字的数量的程序