【问题标题】:jq - count number of items matching selectjq - 计算匹配选择的项目数
【发布时间】:2020-06-28 04:34:50
【问题描述】:

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

如果我有类似的json:

[
  {
    "id": 0,
    "count": 1
  },
  {
    "id": 1,
    "count": 1
  },
  {
    "id": 2,
    "count": 0
  }
]

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

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

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

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

$ jq '.[] | select(.count == 1) | length' in.json
2
2

如何计算select匹配的记录数?

【问题讨论】:

  • 诀窍是把你想要的东西转换成一个代表数组,然后在那个结构上使用length

标签: json jq


【解决方案1】:

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

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

def count(stream): reduce stream as $i (0; .+1);

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

count(.[] | select(.count==1))

【讨论】:

    【解决方案2】:

    使用jq 'map(select(.count==1))|length' in.json

    参见jq 手册中的select 示例:https://stedolan.github.io/jq/manual/#select(boolean_expression)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      相关资源
      最近更新 更多