我有一个问题:
.modules[].resources | select (.[]!=null)
之后我得到了:
{ somestuff } { somestuff } { somestuff }
毕竟我添加了一些内容:
.modules[].resources | select (.[]!=null) | length
我有:
1 1 1
但我需要计算元素,所以我需要输出3。我该如何实施呢?
事实上,从第一个查询输出创建一个数组来运行它是非常有用的
[ { somestuff } , { somestuff } , { somestuff } ]
答案 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)