Comment combiner la séquence d'objets dans jq en un seul objet?
Je voudrais le convertir le flux d'objets:
{
"a": "green",
"b": "white"
}
{
"a": "red",
"c": "purple"
}
en un seul objet:
{
"a": "red",
"b": "white",
"c": "purple"
}
Aussi, comment puis-je envelopper la même séquence dans un tableau?
[
{
"a": "green",
"b": "white"
},
{
"a": "red",
"c": "purple"
}
]
Malheureusement, le manuel est gravement défaut dans la globalité, et google ne trouve pas les réponses.
- comment vous est venue cette entrée pour commencer? est la séquence en cours de création par un jq commande qui est filtré à travers quelque chose comme .[], ou est-il vraiment l'état d'origine de l'entrée que vous obtenez? Si l'ancien, ce qui est très souvent le cas lors du démarrage avec JSON valide, alors l'jq commande qui a abouti à la séquence peut probablement être facilement modifié pour la sortie d'un tableau en entourant le traitement itératif de commande avec [ et ], plutôt que d'avoir à pipe deux jq commandes, la seconde, qui serait -s
Vous devez vous connecter pour publier un commentaire.
Si votre entrée est un flux d'objets, alors à moins que votre jq a
inputs
, les objets doivent être "slurped", par exemple, à l'aide de l'option-s option de ligne de commande, afin de les combiner.Donc une manière de combiner des objets dans le flux d'entrée est à utiliser:
Pour le deuxième problème, la création d'un tableau:
Il y a bien sûr d'autres solutions, mais elles sont simples et ne nécessitent pas la version la plus récente de jq. Avec jq 1.5 et les versions ultérieures, vous pouvez utiliser des "facteurs de production", par exemple
jq -n '[inputs]'
Solutions efficaces
Plutôt que d'aspirer (que ce soit via l'option-s, ou à l'aide de
[inputs]
), il serait plus efficace d'utiliserreduce
avecinputs
et l'-n option de ligne de commande. Par exemple, de combiner les flux d'objets en un seul objet:<jq expression> | add
n'est pas tout à fait faire ce que je veux...[] | <expression> | add
en. | map(<expression>) | add
et maintenant, il fait ce que je veux 😉Une alternative à aspirer à l'aide de l'option-s de la ligne de commande option est d'utiliser le
inputs
filtre. Comme:Ceci va produire un objet avec tous les objets d'entrée combiné.