2017-09-16 5 views
1

Ich habe eine JSON-Liste, die ich in der Befehlszeile zusammenführen möchte.merge json Objekte mit jq

Eingang:
[ 
{ 
    "ipaddress": "10.10.10.222", 
    "name": "alice" 
}, 
{ 
    "ipaddress": "10.20.20.77", 
    "name": "bob" 
}, 
{ 
    "version": "6.7", 
    "name": "alice" 
}, 
{ 
    "version": "5.2.2", 
    "name": "bob" 
} 
] 

Erwartete Ausgabe:

{"name": "alice", "ipaddress": "10.10.10.222", "version": "6.7"}, 
{"name": "bob", "ipaddress": "10.20.20.77", "version": "5.2.2"} 

können Sie mir helfen? Vielen Dank. bernd

+0

Vielleicht Ihre Antwort gefunden werden kann [hier] (https://stackoverflow.com/questions/21450060/how-to- join-two-json-objekt-in-javascript-ohne-verwenden-jquery). – Abe

+0

@Abe - jq ist nicht dasselbe wie jquery. –

Antwort

1

Wenn die Abtastdaten in data.json ist, den Befehl

$ jq -Mr '[ group_by(.name)[] | add | tojson ] | join(",\n")' data.json 

wird die Ausgabe

{"name": "alice", "ipaddress": "10.10.10.222", "version": "6.7"}, 
{"name": "bob", "ipaddress": "10.20.20.77", "version": "5.2.2"} 

Jedoch produzieren, wenn, was tatsächlich gewünscht wird, eine einzelne Anordnung von Objekten ist, dann wird der Befehl

$ jq -M '[group_by(.name)[] | add]' data.json 

produziert

[ 
    { 
    "ipaddress": "10.10.10.222", 
    "name": "alice", 
    "version": "6.7" 
    }, 
    { 
    "ipaddress": "10.20.20.77", 
    "name": "bob", 
    "version": "5.2.2" 
    } 
] 
3
jq -c 'group_by(.name)[]|add' input.json 

erzeugt einen Strom der JSON Objekte (d.h. ohne dazwischenliegende Kommas).

Besser noch wäre group_by/1 ganz zu vermeiden, da es eine Art beinhaltet:

def add_by(f): 
    reduce .[] as $x ({}; ($x|f) as $f | .[$f] += [$x]) 
    | [.[] | add]; 

add_by(.name) 
+0

Würde es Ihnen etwas ausmachen zu erklären, wie der reduce Teil funktioniert? Ich sehe, was passiert: Es macht ein Objekt, dessen Schlüssel "Alice" und "Bob" sind, und die Werte dieser Schlüssel sind Arrays, die mit Objekten gefüllt sind, die den entsprechenden .name-Wert haben. Aber wie wählt es nur die Objekte mit "Alice" aus, um mit der "Alice" -Taste zu gehen? Das entzieht sich mir. Vielen Dank! – user197693

+0

@ user197693 - Die Zeile 'reduce' gruppiert die Objekte nach .name; Sie können dies sehen, indem Sie Debug-Filter hinzufügen. – peak

+0

Ich denke ich sehe es jetzt. Ich wusste nichts über Debug-Filter. Vielen Dank. – user197693