Tengo el siguiente archivo json:
{
"FOO": {
"name": "Donald",
"location": "Stockholm"
},
"BAR": {
"name": "Walt",
"location": "Stockholm"
},
"BAZ": {
"name": "Jack",
"location": "Whereever"
}
}
Estoy usando jq y quiero obtener los elementos de "nombre" de los objetos donde 'ubicación' es 'Estocolmo'.
Sé que puedo obtener todos los nombres por
cat json | jq .[] | jq ."name"
"Jack"
"Walt"
"Donald"
Pero no puedo entender cómo imprimir solo ciertos objetos, dado el valor de una subclave (aquí "location" : "Stockholm"
).
Para obtener una secuencia de solo los nombres:
produce:
Para obtener una secuencia de pares correspondientes (nombre clave, atributo "nombre"), considere:
Salida:
fuente
name
variable clave (utilizar una función de cáscara con$1
como parámetro) no funciona:termux-contact-list |jq -r '.[] | select(.name=="$1")|.number'
. Yo lo llamo asícool_fn Name1
. Sin embargo, esto funciona:termux-contact-list |jq -r '.[] | select(.name=="Name1")|.number'
Tenía una pregunta similar relacionada: ¿Qué pasaría si quisieras recuperar el formato original del objeto (con nombres clave, por ejemplo, FOO, BAR)?
Jq proporciona
to_entries
yfrom_entries
para convertir entre objetos y matrices de pares clave-valor. Eso junto conmap
todo el selectoUsando la
with_entries
taquigrafía, esto se convierte en:fuente
with_entries()
, generalmente también quieres usarlo.value
en laselect
cláusula. Esto se debe a que lato_entries
macro convierte las entradas dadas.key
y se.value
empareja, lo que también sucede conwith_entries
.