我无法理解jq。我甚至无法阐明我想要学习的东西。
我想我想要一张外卡?我的愿望是,给出一个像这样的json片段:
d.TrimEnd(new char[]{'|'});
计算某种类型出现的次数,或者甚至只将所有类型输出到文件中。
这完全不起作用(在简化的例子中没有意义):
{
"logs": {
"-MnpQaRONGXz9tff-W": {
"points": 10,
"type": "signup"
},
"-N5qlX1mQ3SYA9RXdE": {
"points": 15,
"type": "welcome"
},
"-N5rx8PAcNgWu25zRf": {
"points": 5,
"type": "vote"
},
"-N5s29TyZ33snUqC5X": {
"points": 5,
"type": "vote"
}
},
"total": 35
}
会给我一个简单的对象或类型列表。
答案 0 :(得分:1)
不是jq
- 仅答案,但您可以获取所有type
字段的列表,然后通过uniq -c
管道以获取计数。
$ jq '.logs[] | .type' tmp.json | uniq -c
1 signup
1 welcome
2 vote
答案 1 :(得分:1)
获取所有对象的所有“类型”值的流,无论嵌套有多深:
.. | select(.type?) | .type
在您的特定情况下,以下内容就足够了:
.[] | select(type == "object") | .[].type
制作制表:
def tabulate: reduce .[] as $i ({}; .[$i] += 1 );
[.[] | select(type == "object") | .[].type] | tabulate
根据您的输入,输出将是:
{
"signup": 1,
"welcome": 1,
"vote": 2
}
答案 2 :(得分:1)
以下是使用 tostream 和减少
的解决方案reduce (tostream|select(length==2)) as [$p,$v] (
{}
; if $p[-1] == "type" then .[$v] += 1 else . end
)
带样本数据的输出
{
"signup": 1,
"welcome": 1,
"vote": 2
}