查询后如何计算元素数?

时间:2017-09-28 03:45:18

标签: jq

我有一个问题:

.modules[].resources | select (.[]!=null)

之后我得到了:

{ somestuff } { somestuff } { somestuff }

毕竟我添加了一些内容:

.modules[].resources | select (.[]!=null) | length

我有:

1 1 1

但我需要计算元素,所以我需要输出3。我该如何实施呢?

事实上,从第一个查询输出创建一个数组来运行它是非常有用的

[ { somestuff } , { somestuff } , { somestuff } ]

3 个答案:

答案 0 :(得分:1)

您可以将查询结果放入列表中并获取此列表的长度:

[ .modules[].resources | select (.[]!=null) ] | length

答案 1 :(得分:1)

由于您表示从第一个查询输出创建数组非常有用,因此您可能希望在此处使用map

让我们假设你的数据是这样的 来自此问题的数据:jq: search by value from another array element

{
  "modules": [
    {
      "resources": [
        {
          "type": "openstack_compute_instance_v2",
          "primary": {
            "id": "5edfe2bf-94df-49d5-8118-3e91fb52946b",
            "attributes": {
              "name": "jumpbox"
            }
          }
        },
        {
          "type": "openstack_compute_floatingip_associate_v2",
          "primary": {
            "attributes": {
              "instance_id": "5edfe2bf-94df-49d5-8118-3e91fb52946b",
              "floating_ip": "10.120.241.21"
            }
          }
        }
      ]
    }
  ]
}

将此数据用于您的过滤器

   .modules[].resources 
 | select (.[]!=null)    #< do you really want this `[]` ?

将生成整个.resources数组的两个副本。您可能需要的是

   .modules[].resources 
 | map(select(.!=null))

会给你一个数组

[
  {
    "type": "openstack_compute_instance_v2",
    "primary": {
      "id": "5edfe2bf-94df-49d5-8118-3e91fb52946b",
      "attributes": {
        "name": "jumpbox"
      }
    }
  },
  {
    "type": "openstack_compute_floatingip_associate_v2",
    "primary": {
      "attributes": {
        "instance_id": "5edfe2bf-94df-49d5-8118-3e91fb52946b",
        "floating_ip": "10.120.241.21"
      }
    }
  }
]

获取长度,只需添加长度:

  .modules[].resources
| map(select(.!=null))
| length

在此示例中给出

2

由于map(f)定义为[ .[] | f ],因此上述过滤器确实是

  .modules[].resources
| [
      .[]
    | select(.!=null)
  ]
| length

在这种形式中,您可以清楚地看到中间阵列的构造。

另请注意,jq提供了一个内置的values过滤器,定义为select(.!=null),因此此示例可以进一步简化为

  .modules[].resources
| map(values)
| length

答案 2 :(得分:0)

jq: count nest object values which satisfy condition

所述

最佳解决方案(例如,因为它不涉及构造中间数组)将使用count,定义如下:

  

def count(s):将s减少为$ i(0;。+ 1);

使用此定义,您应该只需在查询周围包装count(...),因为它会生成一个流:

count(.modules[].resources | select (.[]!=null))

或许你想要更接近的东西:

count(.modules[].resources | objects)