2016-04-27 3 views
0

Ich muss ein Array (von AWS-Instanz-IDs) durchlaufen, dann ziehen Tags und fügen sie in ein Array mit jq.jq - in for-Schleife, ein einzelnes neues Array erstellen, dann Schlüssel/Wert-Paare anhängen

Ich habe Variablen, die meine Bedürfnisse definieren. In diesem Fall:

VolumeId 
Tag1Value 
Tag2Value 
Tag3Value 

Sie ändern sich, wenn ich in einer for-Schleife durchlaufen. Ich weiß, wie ein neues Array zu erstellen:

jq -n --arg v "$VolumeId" '[{"VolumeId": $v}]' 

Doch diese jedes Mal ein neues JSON-Array erstellt. Ich brauche es einmal erstellt und dann daran angehängt, während ich durch die Schleife gehe.

Der Ausgang ich suche ist ein neu JSON-Array erstellen:

[ 
    { 
    "VolumeId": $VolumeId, 
    "Tag1": $Tag1Value, 
    "Tag2": $Tag2Value, 
    "Tag3": $Tag3Value 
    }, 
    { 
    "VolumeId": $VolumeId, 
    "Tag1": $Tag1Value, 
    "Tag2": $Tag2Value, 
    "Tag3": $Tag3Value 
    }, 
    { 
    "VolumeId": $VolumeId, 
    "Tag1": $Tag1Value, 
    "Tag2": $Tag2Value, 
    "Tag3": $Tag3Value 
    } 
] 

Jede Hilfe ist wirklich zu schätzen. Hier

Antwort

1

ist ein Beispiel zeigt, wie ein Strom von Werten (hier ein Strom von Arrays) in eine JSON-Array von Objekten kombiniert werden:

(cat << EOF 
["VolumeId1", "Tag1Value1", "Tag2Value1", "Tag3Value1"] 
["VolumeId2", "Tag1Value2", "Tag2Value2", "Tag3Value2"] 
["VolumeId3", "Tag1Value3", "Tag2Value3", "Tag3Value3"] 
EOF 
) | jq -s 'map({VolumeId: .[0], Tag1Value: .[1], Tag2Value: .[2], Tag3Value: .[3] }) ' 

Ausgang:

[ 
    { 
    "VolumeId": "VolumeId1", 
    "Tag1Value": "Tag1Value1", 
    "Tag2Value": "Tag2Value1", 
    "Tag3Value": "Tag3Value1" 
    }, 
    { 
    "VolumeId": "VolumeId2", 
    "Tag1Value": "Tag1Value2", 
    "Tag2Value": "Tag2Value2", 
    "Tag3Value": "Tag3Value2" 
    }, 
    { 
    "VolumeId": "VolumeId3", 
    "Tag1Value": "Tag1Value3", 
    "Tag2Value": "Tag2Value3", 
    "Tag3Value": "Tag3Value3" 
    } 
] 
+0

Dank @peak Es funktioniert, aber es gibt ein Problem. Während ich durch eine for-Schleife iteriere, bekomme ich jedes Mal neue Arrays. Irgendeine Möglichkeit, es 1 Array zu machen? – user6127511

+0

Die Idee besteht darin, die Ausgabe der gesamten "for" -Schleife an jq zu übergeben. In Anlehnung an (für ....; do ... done) | jq -s ... – peak

+0

Auch (und ich entschuldige mich dafür, meine Ursprungsfrage nicht klar zu machen), müsste ich das neue Array einer Variablen zuweisen, damit ich es später mit einem anderen Array zusammenführen kann. '| new_array = $ (jq -s 'map ({VolumeId:. [0] .... 'funktioniert nicht – user6127511

Verwandte Themen