test remove online instalar from array argjson json jq

json - remove - jq test



jq: clave de impresiĆ³n y valor para cada entrada en un objeto (2)

¿Cómo consigo jq para tomar json así?

{ "host1": { "ip": "10.1.2.3" }, "host2": { "ip": "10.1.2.2" }, "host3": { "ip": "10.1.18.1" } }

y generar esta salida:

host1, 10.1.2.3 host2, 10.1.2.2 host3, 10.1.18.1

No estoy interesado en el formato, simplemente no puedo averiguar cómo acceder al nombre y valor de la clave.


Encontré una solución muy elegante.

jq ''with_entries(.value |= .ip)''

Cuales ouputs

{ "host1": "10.1.2.3", "host2": "10.1.2.2", "host3": "10.1.18.1" }

Aquí está el fragmento de jqplay para jugar con: https://jqplay.org/s/Jb_fnBveMQ

La función with_entries convierte cada objeto en la lista de objetos en el par clave / valor, por lo que podemos acceder a .key o .value respectivamente, estamos actualizando (sobrescribiendo) cada valor KV-item con el campo .ip mediante el uso de la actualización |= operador


Para obtener las claves de nivel superior como una transmisión, puede usar las claves []. Así que una solución a su problema particular sería:

jq -r ''keys[] as $k | "/($k), /(.[$k] | .ip)"''

keys produce los nombres de las teclas en orden ordenado; Si los quiere en el orden original, use keys_unsorted .

Otra alternativa, que produce claves en el orden original, es:

jq -r ''to_entries[] | "/(.key), /(.value | .ip)"''

Salida CSV y TSV

Los filtros @csv y @tsv también pueden valer la pena considerar aquí, por ejemplo,

jq -r ''to_entries[] | [.key, .value.ip] | @tsv''

produce:

host1 10.1.2.3 host2 10.1.2.2 host3 10.1.18.1