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
namevariable clave (utilizar una función de cáscara con$1como 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_entriesyfrom_entriespara convertir entre objetos y matrices de pares clave-valor. Eso junto conmaptodo el selectoUsando la
with_entriestaquigrafía, esto se convierte en:fuente
with_entries(), generalmente también quieres usarlo.valueen laselectcláusula. Esto se debe a que lato_entriesmacro convierte las entradas dadas.keyy se.valueempareja, lo que también sucede conwith_entries.