2017-09-16 7 views
1

J'ai une liste JSON que je veux fusionner en ligne de commande.fusionner des objets json avec jq

Entrée:
[ 
{ 
    "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" 
} 
] 

Résultats escomptés:

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

pouvez-vous me aider? Je vous remercie. BERND

+0

Peut-être que votre réponse peut être trouvée [ici] (https://stackoverflow.com/questions/21450060/how-to- joindre-deux-json-objet-en-javascript-sans-utilisation-jquery). – Abe

+0

@Abe - jq n'est pas la même chose que jquery. –

Répondre

1

Si les données de l'échantillon est data.json, la commande

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

va produire la sortie

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

Cependant, si ce qui est réellement désiré est un tableau d'objets alors la commande

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

produit

[ 
    { 
    "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 

produit un flux des objets JSON (à savoir sans virgule intermédiaire).

Il serait mieux encore être d'éviter group_by/1 tout à fait car il implique une sorte:

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

add_by(.name) 
+0

Pourriez-vous expliquer comment fonctionne la partie réduire? Je vois ce qui se passe: il fait un objet dont les clés sont "alice" et "bob" et les valeurs de ces clés sont des tableaux remplis d'objets qui ont la valeur .name correspondante. Mais comment sélectionner uniquement les objets avec "alice" pour aller avec la touche "alice"? Cela m'échappe. Je vous remercie! – user197693

+0

@ user197693 - La ligne 'reduce' regroupe les objets par .name; vous pouvez le voir en ajoutant des filtres 'debug'. – peak

+0

Je pense que je le vois maintenant. Je ne connaissais pas les filtres de débogage. Merci. – user197693