Da Sie angegeben, sehr nützlich wäre ein Array von der ersten Ausgabe der Abfrage zu erstellen, was wollen Sie wahrscheinlich hier verwenden ist map.
Lassen Sie sich Ihre Daten übernehmen ist so etwas wie die Daten aus dieser Frage: 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"
}
}
}
]
}
]
}
mit diesen Daten Ihrer Filter
.modules[].resources
| select (.[]!=null) #< do you really want this `[]` ?
würde zwei Kopien der gesamten .resources
Array erzeugen. Was können Sie stattdessen wollen, ist
.modules[].resources
| map(select(.!=null))
, die Ihnen ein Array
[
{
"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"
}
}
}
]
die Länge zu erhalten, fügen Sie einfach Länge:
.modules[].resources
| map(select(.!=null))
| length
in diesem Beispiel geben
2
Weil map(f)
wird als [ .[] | f ]
der obige Filter definiert wirklich
.modules[].resources
| [
.[]
| select(.!=null)
]
| length
In dieser Form ist man deutlich den Aufbau des Zwischenmatrix zu sehen.
beachte auch, dass jq stellt einen eingebauten Filter in values die als select(.!=null)
definiert ist dieses Beispiel so weiter vereinfacht werden könnte, um nur
.modules[].resources
| map(values)
| length
es Unfortinatly hat nicht geholfen. Ich nehme an, weil Ihr Vorschlag über die Array-Struktur falsch ist. Es ist ein wenig komplexer und es gibt dort Ampy-Arrays, also warum habe ich (. []! = Null) –