我有非常大的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”和“numberofunused”。
我最成功的是:
cat json | jq '.[] | .[].y | .["number of un-used"] | .count'

但结果包含了很多“空”,因为“未使用的数量”不在所有“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/

10-15 03:24