J'utilise les outils jq (jq-json-processor) dans le script shell pour analyser json.
J'ai 2 fichiers json et je souhaite les fusionner en un seul fichier
Voici le contenu des fichiers:
fichier1
{
"value1": 200,
"timestamp": 1382461861,
"value": {
"aaa": {
"value1": "v1",
"value2": "v2"
},
"bbb": {
"value1": "v1",
"value2": "v2"
},
"ccc": {
"value1": "v1",
"value2": "v2"
}
}
}
fichier2
{
"status": 200,
"timestamp": 1382461861,
"value": {
"aaa": {
"value3": "v3",
"value4": 4
},
"bbb": {
"value3": "v3"
},
"ddd": {
"value3": "v3",
"value4": 4
}
}
}
résultat attendu
{
"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
}
}
}
J'essaye beaucoup de combinaisons mais le seul résultat que j'obtiens est le suivant, ce qui n'est pas le résultat attendu:
{
"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"
}
}
En utilisant cette commande:
jq -s '.[].value' file1 file2
json
shell
command-line
jq
Janfy
la source
la source
json
utilisez:cat f1 f2 | json --deep-merge
json
@ xer0x?json
outil, rendez-vous sur github.com/trentm/jsonRéponses:
Depuis la version 1.4, cela est désormais possible avec l'
*
opérateur. Lorsqu'on lui donne deux objets, il les fusionnera récursivement. Par exemple,Important: notez l'
-s (--slurp)
indicateur, qui place les fichiers dans le même tableau.Vous obtiendriez:
Si vous souhaitez également vous débarrasser des autres clés (comme le résultat attendu), une façon de le faire est la suivante:
Ou probablement un peu plus efficace (car il ne fusionne aucune autre valeur):
la source
-s
indicateur est important car sans lui les deux objets ne sont pas dans un tableau.Utilisez
jq -s add
:Cela lit tous les textes JSON de stdin dans un tableau (
jq -s
fait cela) puis il les "réduit".(
add
est défini commedef add: reduce .[] as $x (null; . + $x);
, qui itère sur les valeurs du tableau d'entrée / objet et les ajoute. Ajout d'objet == merge.)la source
reduce .[] as $x ({}; . * $x)
- voir aussi la réponse de jrib .Qui sait si vous en avez encore besoin, mais voici la solution.
Une fois que vous arrivez à l'
--slurp
option, c'est facile!Ensuite, l'
+
opérateur fera ce que vous voulez:(Remarque: si vous souhaitez fusionner des objets internes au lieu de simplement écraser ceux du fichier de gauche par ceux du fichier de droite, vous devrez le faire manuellement)
la source
Voici une version qui fonctionne de manière récursive (en utilisant
*
) sur un nombre arbitraire d'objets:la source
jq -s 'reduce .[] as $item ({}; . * $item)' *.json
Premièrement, {"value": .value} peut être abrégé en seulement {value}.
Deuxièmement, l'option --argfile (disponible dans jq 1.4 et jq 1.5) peut être intéressante car elle évite d'avoir à utiliser l'option --slurp.
En les mettant ensemble, les deux objets des deux fichiers peuvent être combinés de la manière spécifiée comme suit:
Le drapeau '-n' dit à jq de ne pas lire depuis stdin, puisque les entrées proviennent des options --argfile ici.
la source
--argile
depuis--slurpfile
Cela peut être utilisé pour fusionner n'importe quel nombre de fichiers spécifié dans la commande:
jq -rs 'reduce .[] as $item ({}; . * $item)' file1.json file2.json file3.json ... file10.json
ou ceci pour n'importe quel nombre de fichiers
jq -rs 'reduce .[] as $item ({}; . * $item)' ./*.json
la source