Json 使用jq生成字段值频率计数

Json 使用jq生成字段值频率计数,json,stream,histogram,jq,summary,Json,Stream,Histogram,Jq,Summary,我可以从JSON字段中查询所有唯一值,如下所示: $ cat all.json | jq '.complianceState' | sort | uniq "compliant" "configManager" "inGracePeriod" "noncompliant" "unknown" 我可以迂腐地查询这些唯一字段值的频率计数,如下所示: $ cat all.json | jq '.complianceState' | grep '^"configManager"$' | wc -l

我可以从JSON字段中查询所有唯一值,如下所示:

$ cat all.json | jq '.complianceState' | sort | uniq

"compliant"
"configManager"
"inGracePeriod"
"noncompliant"
"unknown"
我可以迂腐地查询这些唯一字段值的频率计数,如下所示:

$ cat all.json | jq '.complianceState' | grep '^"configManager"$' | wc -l

116
jq
中是否有一种方法可以一次完成这一切,从而产生如下输出:

{
    "compliant" : 123000,
    "noncompliant" : 2000,
    "configManager" : 116
}

从我的标准库:

# bag of words
# WARNING: this is not collision-free!
def bow(stream): 
  reduce stream as $word ({}; .[($word|tostring)] += 1);

使用此选项,您可以使用过滤器:

bow(inputs | .complianceState)
与-n命令行选项结合使用

总之 将所有这些放在一起的一种方法是将上述jq行放在一个文件中,比如bow.jq,然后按如下方式调用jq:

jq -n -f bow.jq all.json

另一种方法是使用模块系统——请参阅jq手册和/或了解详细信息。

我是新来的
jq
(brew将其安装在MacOS上)-如何添加像这样的
bow
功能的自定义插件,以便
jq
工具将其选中?请参阅更新;食谱中的相关章节越来越近了。当我运行
jq-f bow.jq all.json
时,我得到了这个(简短的)输出片段:-因此它为每个事件分配了1-但没有计数。更新提供了一个如何使用
inputs
处理流的示例。你是一个超级明星!最新更新工作完美:谢谢!