jq - 计算匹配选择的项目数

Inc*_*tic 5 json jq

我正在尝试计算与某些属性匹配的记录数。

如果我有像这样的 json:

[
  {
    "id": 0,
    "count": 1
  },
  {
    "id": 1,
    "count": 1
  },
  {
    "id": 2,
    "count": 0
  }
]
Run Code Online (Sandbox Code Playgroud)

我正在尝试获取计数为 1 的记录数。

我可以通过以下方式获取匹配的记录:

$ jq '.[] | select(.count == 1)' in.json
{
  "id": 0,
  "count": 1
}
{
  "id": 1,
  "count": 1
}
Run Code Online (Sandbox Code Playgroud)

但输出列出了两个项目,所以我无法直接使用length它们来计数。相反,使用长度给出每个项目的长度。

$ jq '.[] | select(.count == 1) | length' in.json
2
2
Run Code Online (Sandbox Code Playgroud)

如何计算 匹配了多少条记录select

pea*_*eak 5

为了提高效率,应该避免length在构造数组上使用。相反,最好使用面向流的方法。

这是一种有效的解决方案,为了方便起见,它使用通用count函数,定义为:

def count(stream): reduce stream as $i (0; .+1);
Run Code Online (Sandbox Code Playgroud)

有了这个 def,解决方案就很简单:

count(.[] | select(.count==1))
Run Code Online (Sandbox Code Playgroud)