Eu tenho o seguinte arquivo json:
{
"FOO": {
"name": "Donald",
"location": "Stockholm"
},
"BAR": {
"name": "Walt",
"location": "Stockholm"
},
"BAZ": {
"name": "Jack",
"location": "Whereever"
}
}
Estou usando jq e quero obter os elementos "name" dos objetos em que 'location' é 'Stockholm'.
Eu sei que posso obter todos os nomes
cat json | jq .[] | jq ."name"
"Jack"
"Walt"
"Donald"
Mas não consigo descobrir como imprimir apenas certos objetos, dado o valor de uma subchave (aqui "location" : "Stockholm"
).
Para obter um fluxo apenas dos nomes:
produz:
Para obter um fluxo de pares correspondentes (nome da chave, atributo "nome")), considere:
Resultado:
fonte
name
variável-chave (usar uma função shell com$1
como parâmetro) não funciona:termux-contact-list |jq -r '.[] | select(.name=="$1")|.number'
. Eu chamo assimcool_fn Name1
. No entanto, isso funciona:termux-contact-list |jq -r '.[] | select(.name=="Name1")|.number'
Eu tinha uma pergunta semelhante: E se você quisesse o formato do objeto original de volta (com nomes de chave, por exemplo, FOO, BAR)?
Jq fornece
to_entries
efrom_entries
converte entre objetos e matrizes de pares de valores-chave. Que junto commap
a seleçãoUsando a
with_entries
abreviação, isso se torna:fonte
with_entries()
, geralmente também deseja usar.value
naselect
cláusula. Isso ocorre porque ato_entries
macro converte as entradas fornecidas em.key
e.value
emparelha, o que também acontece comwith_entries
.