2017-09-28 1 views
0

Ich habe eine Abfrage:Wie kann ich die Anzahl der Elemente nach der Abfrage zählen?

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

und nach habe ich bekam:

{ somestuff } { somestuff } { somestuff } 

wenn ich hinzufügen legth schließlich:

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

ich haben:

1 1 1 

aber ich brauche d um Elemente zu zählen, also brauche ich 3 in einer Ausgabe. Wie kann ich es implementieren?

In der Tat wäre es sehr nützlich sein, eine Anordnung von der ersten Ausgabe der Abfrage zu erstellen, um zu arbeiten mit ihm furthure

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

Antwort

0

Sie die Ergebnisse der Abfrage in eine Liste setzen und die Länge dieser Liste erhalten :

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

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 
+0

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) –

0

Als

bei jq: count nest object values which satisfy condition erwähnt

die beste Lösung (z.B.denn es wäre nicht Konstruktion eines Zwischenarrays beinhalten) count, definiert wie folgt zu verwenden:

def (n) zählen. s reduzieren als $ i (0; + 1);

Mit dieser Definition sollten Sie einfach in der Lage sein count(...) um Ihre Suche zu wickeln, da es einen Strom erzeugt:

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

Oder vielleicht möchten Sie etwas näher an:

count(.modules[].resources | objects) 
Verwandte Themen