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