Ich verwende die jq- Tools (jq-json-Prozessor) im Shell-Skript, um json zu analysieren.
Ich habe 2 JSON-Dateien und möchte sie zu einer einzigen Datei zusammenführen
Hier der Inhalt von Dateien:
Datei1
{
"value1": 200,
"timestamp": 1382461861,
"value": {
"aaa": {
"value1": "v1",
"value2": "v2"
},
"bbb": {
"value1": "v1",
"value2": "v2"
},
"ccc": {
"value1": "v1",
"value2": "v2"
}
}
}
Datei2
{
"status": 200,
"timestamp": 1382461861,
"value": {
"aaa": {
"value3": "v3",
"value4": 4
},
"bbb": {
"value3": "v3"
},
"ddd": {
"value3": "v3",
"value4": 4
}
}
}
erwartetes Ergebnis
{
"value": {
"aaa": {
"value1": "v1",
"value2": "v2",
"value3": "v3",
"value4": 4
},
"bbb": {
"value1": "v1",
"value2": "v2",
"value3": "v3"
},
"ccc": {
"value1": "v1",
"value2": "v2"
},
"ddd": {
"value3": "v3",
"value4": 4
}
}
}
Ich versuche viel Kombination, aber das einzige Ergebnis, das ich bekomme, ist das folgende, was nicht das erwartete Ergebnis ist:
{
"ccc": {
"value2": "v2",
"value1": "v1"
},
"bbb": {
"value2": "v2",
"value1": "v1"
},
"aaa": {
"value2": "v2",
"value1": "v1"
}
}
{
"ddd": {
"value4": 4,
"value3": "v3"
},
"bbb": {
"value3": "v3"
},
"aaa": {
"value4": 4,
"value3": "v3"
}
}
Mit diesem Befehl:
jq -s '.[].value' file1 file2
json
shell
command-line
jq
Janfy
quelle
quelle
json
Verwendung zu tun :cat f1 f2 | json --deep-merge
json
Woher / Wie bekommst du @ xer0x?json
Tool zu bekommen , gehen Sie zu github.com/trentm/jsonAntworten:
Seit 1.4 ist dies nun mit dem
*
Bediener möglich. Wenn zwei Objekte angegeben werden, werden sie rekursiv zusammengeführt. Beispielsweise,Wichtig: Beachten Sie das
-s (--slurp)
Flag, mit dem Dateien im selben Array abgelegt werden.Würde dich bekommen:
Wenn Sie auch die anderen Schlüssel entfernen möchten (wie das erwartete Ergebnis), können Sie dies folgendermaßen tun:
Oder das vermutlich etwas effizientere (weil es keine anderen Werte zusammenführt):
quelle
-s
Flag ist wichtig, da sich die beiden Objekte ohne es nicht in einem Array befinden.Verwendung
jq -s add
:Dies liest alle JSON-Texte von stdin in ein Array (
jq -s
macht das) und "reduziert" sie dann.(
add
ist definiert alsdef add: reduce .[] as $x (null; . + $x);
, das über die Werte des Eingabearrays / Objekts iteriert und diese hinzufügt. Objektaddition == Zusammenführen.)quelle
reduce .[] as $x ({}; . * $x)
- siehe auch jribs Antwort .Wer weiß, ob Sie es noch brauchen, aber hier ist die Lösung.
Sobald Sie die
--slurp
Option erreicht haben, ist es einfach!Dann macht der
+
Bediener, was Sie wollen:(Hinweis: Wenn Sie innere Objekte zusammenführen möchten, anstatt nur die linken mit den rechten zu überschreiben, müssen Sie dies manuell tun.)
quelle
Hier ist eine Version, die rekursiv (mit
*
) einer beliebigen Anzahl von Objekten arbeitet:quelle
jq -s 'reduce .[] as $item ({}; . * $item)' *.json
Erstens kann {"value": .value} auf nur {value} abgekürzt werden.
Zweitens kann die Option --argfile (verfügbar in jq 1.4 und jq 1.5) von Interesse sein, da die Verwendung der Option --slurp vermieden wird.
Wenn Sie diese zusammenfügen, können die beiden Objekte in den beiden Dateien wie folgt kombiniert werden:
Das '-n'-Flag weist jq an, nicht von stdin zu lesen, da Eingaben von den Optionen --argfile hier stammen.
quelle
--argile
für--slurpfile
Dies kann verwendet werden, um eine beliebige Anzahl von Dateien zusammenzuführen, die im Befehl angegeben sind:
jq -rs 'reduce .[] as $item ({}; . * $item)' file1.json file2.json file3.json ... file10.json
oder dies für eine beliebige Anzahl von Dateien
jq -rs 'reduce .[] as $item ({}; . * $item)' ./*.json
quelle