gpt4 book ai didi

json - 使用 jq 进行计数

转载 作者:行者123 更新时间:2023-12-03 23:17:38 30 4
gpt4 key购买 nike

如果我有一个看起来像的 JSON 文件,则使用 jq-1.5

[{... ,"sapm_score":40.776, ...} {..., "spam_score":17.376, ...} ...]

我将如何获得 sapm_score > 40 的计数?

谢谢,


更新:

我查看了输入文件,格式实际上是
{... ,"sapm_score":40.776, ...}
{..., "spam_score":17.376, ...}
...

这是否会改变人们需要计算的方式?

最佳答案

[更新:如果输入不是数组,请参阅下面的最后一节。]
count/1
我建议定义一个 count过滤器(也许把它放在你的 ~/.jq 中),也许如下:

 def count(s): reduce s as $_ (0;.+1);

有了这个,假设输入是一个数组,你会写:
 count(.[] | select(.sapm_score > 40))

或更有效地:
 count(.[] | (.sapm_score > 40) // empty)

这种方法(计算流中的项目)通常比使用 length 更可取。因为它避免了与构建数组相关的成本。
count/2
这是 count 的另一个定义您可能喜欢使用(也可能添加到 ~/.jq 中):
def count(stream; cond): count(stream | cond // empty);

这会计算流的元素 cond两者都不是 false也不是 null .

现在,假设输入由一个数组组成,您可以简单地编写:
count(.[]; .sapm_score > 40)

“sapm_score”与“spam_score”

如果关键是您想将“sapm_score”规范化为“spam_score”,那么(例如)您可以使用 count/2如上所述,像这样:
 count(.[]; .spam_score > 40 or .sapm_score > 40)

这假设数组中的所有项目都是 JSON 对象。如果不是这种情况,那么您可能想尝试添加“?”在键名之后:
count(.[]; .spam_score? > 40 or .sapm_score? > 40)

当然,以上所有内容都假设输入是有效的 JSON。如果不是这种情况,请参阅 https://github.com/stedolan/jq/wiki/FAQ#processing-not-quite-valid-json

如果输入是 JSON 对象流...

修改后的问题表明输入由 JSON 对象流组成(而最初输入被称为 JSON 对象数组)。如果输入包含 JSON 对象流,则可以轻松调整上述解决方案,具体取决于您拥有的 jq 版本。如果你的 jq 版本有 inputs那么推荐(2)。

(1) 所有版本:使用 -s命令行选项。

(2)如果你的jq有 inputs :使用 -n命令行选项,并更改 .[]以上为 inputs ,例如
count(inputs; .spam_score? > 40 or .sapm_score? > 40)

关于json - 使用 jq 进行计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47063311/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com