使用jq生成域值频率计数

问题描述 投票:1回答:1

我可以像这样从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
}
json stream histogram jq summary
1个回答
1
投票

来自我的标准库:

# 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手册和/或Cookbook

© www.soinside.com 2019 - 2024. All rights reserved.