2017-09-18 1 views
0

ich ein JSON-Array haben, die eine Menge von Objekten enthält, und es sieht wie folgt aus:jq: Fügen Sie Werte eines bestimmten Schlüssels für alle Objekte mit gleichen ID

[ 
{"ID":"A","VALUE":12,"TYPE":"single"}, 
{"ID":"A","VALUE":17,"TYPE":"single"}, 
{"ID":"A","VALUE":-7,"TYPE":"single"}, 

{"ID":"B","VALUE":35,"TYPE":"single"}, 
{"ID":"B","VALUE":10,"TYPE":"single"}, 
{"ID":"B","VALUE":15,"TYPE":"single"}, 

{"ID":"C","VALUE":0,"TYPE":"single"}, 
{"ID":"C","VALUE":13,"TYPE":"single"}, 
{"ID":"C","VALUE":20.5,"TYPE":"single"} 
] 

Nun würde Ich mag alle Werte hinzufügen für jede ID und neue Objekte mit den Ergebnissen wie folgt aus:

{"ID":"A","VALUE":22,"TYPE":"total"}, 
{"ID":"B","VALUE":60,"TYPE":"total"}, 
{"ID":"C","VALUE":23.5,"TYPE":"total"} 

Zusätzlich sollten die resultierenden Objekte zu der anfänglichen Anordnung hinzugefügt werden.

Ich bin ziemlich neu zu jq, also habe ich etwas Forschung. Tatsächlich weiß ich, wie die Summen für eine ID zu erhalten:

.[] | {ID: .ID, VALUE: .VALUE, TYPE: "total"} 

Aber wie bekomme ich das Format, das ich von hier aus will:

[.[] | select(."ID"=="A").VALUE]|add 

-> 22 

und wie neue Objekte zu schaffen? Mit einer Schleife?

Danke!

Antwort

2

Hier ist eine Lösung, die reduce verwendet die Summen zu berechnen, Objekte in dem festgelegten Format erzeugen und diese in die ursprünglichen Eingangsanordnung:

. + [ 
    reduce .[] as $r ({}; .[$r["ID"]] += $r["VALUE"]) 
    | keys[] as $id 
    | {ID:$id, VALUE:.[$id], TYPE:"total"} 
] 

Hinweis, dass der Wert dieses mit den Abtastdaten für C berechnet ist was ich glaube, ist richtig.

+0

Danke! Das funktioniert, und ja, es sollte 33.5 sein :) – user2556342

2

Sie können sie nach dem ID gruppieren und dann in die neuen Objekte zusammenfassen. Dann kombinieren Sie das mit dem vorhandenen Array von Elementen.

[.[], (group_by(.ID)[] | { ID: .[0].ID, VALUE: map(.VALUE)|add, TYPE: "total" })] 
+0

Das funktioniert auch! Vielen Dank! – user2556342

Verwandte Themen