Siéntete libre de compartir nuestra web y códigos en tus redes sociales, danos de tu ayuda para ampliar esta comunidad.
Solución:
Desde 1.4 esto ahora es posible con el *
operador. Cuando se le den dos objetos, los fusionará recursivamente. Por ejemplo,
jq -s '.[0] * .[1]' file1 file2
Importante: Tenga en cuenta la -s (--slurp)
flag, que coloca los archivos en el mismo array.
te conseguiría:
"value1": 200,
"timestamp": 1382461861,
"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
,
"status": 200
Si también quieres deshacerte del otro keys (como el resultado esperado), una forma de hacerlo es esta:
jq -s '.[0] * .[1] | value: .value' file1 file2
O presumiblemente algo más eficiente (porque no fusiona ningún otro valor):
jq -s '.[0].value * .[1].value | value: .' file1 file2
Usar jq -s add
:
$ echo '"a":"foo","b":"bar" "c":"baz","a":0' | jq -s add
"a": 0,
"b": "bar",
"c": "baz"
Esto lee todos los textos JSON de stdin en un array (jq -s
hace eso) entonces los “reduce”.
(add
Se define como def add: reduce .[] as $x (null; . + $x);
que itera sobre la entrada array’s/valores del objeto y los agrega. Adición de objetos == fusionar.)
Quién sabe si todavía lo necesitas, pero aquí está la solución.
Una vez que llegas a la --slurp
opción, es fácil!
--slurp/-s:
Instead of running the filter for each JSON object in the input,
read the entire input stream into a large array and run the filter just once.
Entonces el +
El operador hará lo que quieras:
jq -s '.[0] + .[1]' config.json config-user.json
(Nota: si desea fusionar objetos internos en lugar de simplemente sobrescribir los del archivo de la izquierda con los del archivo de la derecha, deberá hacerlo manualmente)
valoraciones y comentarios
Si sostienes algún recelo y capacidad de acrecentar nuestro división te insinuamos escribir una ilustración y con placer lo observaremos.