У меня есть следующий файл JSON:
{
"FOO": {
"name": "Donald",
"location": "Stockholm"
},
"BAR": {
"name": "Walt",
"location": "Stockholm"
},
"BAZ": {
"name": "Jack",
"location": "Whereever"
}
}
Я использую jq и хочу получить элементы «name» для объектов, где «location» - «Stockholm».
Я знаю, что могу получить все имена
cat json | jq .[] | jq ."name"
"Jack"
"Walt"
"Donald"
Но я не могу понять, как печатать только определенные объекты, учитывая значение вложенной клавиши (здесь "location" : "Stockholm"
).
Чтобы получить поток только имен:
производит:
Чтобы получить поток соответствующих пар (имя ключа, атрибут «имя»), рассмотрим:
Вывод:
источник
name
ключа переменного (использовать функцию оболочки с в$1
качестве параметра) не работает:termux-contact-list |jq -r '.[] | select(.name=="$1")|.number'
. Я называю это какcool_fn Name1
. Тем не менее, это работает:termux-contact-list |jq -r '.[] | select(.name=="Name1")|.number'
У меня был похожий вопрос: что если вы хотите вернуть исходный формат объекта (с именами ключей, например, FOO, BAR)?
Jq предоставляет
to_entries
иfrom_entries
для преобразования между объектами и массивами пары ключ-значение. Что наряду сmap
избраннымИспользуя
with_entries
сокращение, это становится:источник
with_entries()
вы обычно хотите также использовать.value
вselect
предложении. Это потому, чтоto_entries
макрос преобразует данные записи в.key
и.value
пары, что также происходит сwith_entries
.