Ich habe die folgende JSON-Datei:
{
"FOO": {
"name": "Donald",
"location": "Stockholm"
},
"BAR": {
"name": "Walt",
"location": "Stockholm"
},
"BAZ": {
"name": "Jack",
"location": "Whereever"
}
}
Ich benutze jq und möchte die "Namen" -Elemente der Objekte erhalten, bei denen "Ort" "Stockholm" ist.
Ich weiß, dass ich alle Namen von bekommen kann
cat json | jq .[] | jq ."name"
"Jack"
"Walt"
"Donald"
Angesichts des Werts eines Unterschlüssels (hier "location" : "Stockholm"
) kann ich jedoch nicht herausfinden, wie nur bestimmte Objekte gedruckt werden sollen .
So erhalten Sie einen Stream mit nur den Namen:
produziert:
Beachten Sie Folgendes, um einen Stream entsprechender Paare (Schlüsselname, Attribut "Name") zu erhalten:
Ausgabe:
quelle
name
Schlüsselvariablen (Verwenden einer Shell-Funktion mit$1
als Parameter) funktioniert nicht :termux-contact-list |jq -r '.[] | select(.name=="$1")|.number'
. Ich nenne es wiecool_fn Name1
. Dies funktioniert jedoch:termux-contact-list |jq -r '.[] | select(.name=="Name1")|.number'
Ich hatte eine ähnliche verwandte Frage: Was wäre, wenn Sie das ursprüngliche Objektformat zurückhaben wollten (mit Schlüsselnamen, z. B. FOO, BAR)?
Jq bietet
to_entries
undfrom_entries
konvertiert zwischen Objekten und Schlüssel-Wert-Paar-Arrays. Das zusammen mitmap
rund um die AuswahlMit der
with_entries
Kurzform wird dies:quelle
with_entries()
normalerweise auch.value
in derselect
Klausel verwenden möchten . Dies liegt daran, dass dasto_entries
Makro die angegebenen Einträge in.key
und.value
Pair konvertiert , was auch bei der Fall istwith_entries
.