Mam następujący plik json:
{
"FOO": {
"name": "Donald",
"location": "Stockholm"
},
"BAR": {
"name": "Walt",
"location": "Stockholm"
},
"BAZ": {
"name": "Jack",
"location": "Whereever"
}
}
Korzystam z jq i chcę uzyskać elementy „name” obiektów, w których „location” to „Stockholm”.
Wiem, że mogę uzyskać wszystkie nazwiska
cat json | jq .[] | jq ."name"
"Jack"
"Walt"
"Donald"
Ale nie mogę wymyślić, jak wydrukować tylko niektóre obiekty, biorąc pod uwagę wartość podklucza (tutaj "location" : "Stockholm"
).
Aby uzyskać strumień samych nazw:
produkuje:
Aby uzyskać strumień odpowiednich par (nazwa klucza, atrybut „nazwa”), rozważ:
Wynik:
źródło
name
kluczową zmienną (użyć funkcji z powłoki$1
jako parametr) nie działa:termux-contact-list |jq -r '.[] | select(.name=="$1")|.number'
. Nazywam to takcool_fn Name1
. Działa to jednak:termux-contact-list |jq -r '.[] | select(.name=="Name1")|.number'
Miałem podobne podobne pytanie: co zrobić, jeśli chcesz odzyskać oryginalny format obiektu (z nazwami kluczy, np. FOO, BAR)?
Jq zapewnia
to_entries
ifrom_entries
konwertuje między obiektami i tablicami para-wartość. To wraz zmap
całym wybranymUżywając
with_entries
stenografii, staje się to:źródło
with_entries()
zwykle chcesz również użyć.value
wselect
klauzuli. Wynika to z tego, żeto_entries
makro konwertuje podane wpisy.key
i łączy.value
, co również dzieje się zwith_entries
.