Как удалить все ключи, кроме одного, с помощью jq?

Учитывая список объектов со многими ключами, которые мне не нужны:

[{
    "name": "Alice",
    "group": "Admins",
    "created": "2014"
}, {
    "name": "Bob",
    "group": "Users",
    "created": "2014"
}]

Как отфильтровать эти объекты, чтобы они включали только нужные мне ключи?

[{
    "name": "Alice"
}, {
    "name": "Bob"
}]

Я пробовал jq '.[].name', но это извлекает значения, а не сохраняет объекты.


person Wilfred Hughes    schedule 08.01.2015    source источник


Ответы (4)


Вы можете использовать функцию map() для фильтрации любого ключа:

jq 'map({name: .name})'

Обновлять

Предложено @WilfredHughes: приведенный выше фильтр можно сократить следующим образом:

jq 'map({name})'
person Girish    schedule 08.01.2015
comment
А, отлично работает! Вы даже можете сократить его до jq 'map({name})' - person Wilfred Hughes; 08.01.2015
comment
Или jq '{name}', если ввод является словарем. - person x-yuri; 05.07.2019

вы можете использовать map с del, если знаете ключи, которые вам не нужны:

jq 'map(del (.group) | del (.created))'
person Hans Z.    schedule 08.01.2015
comment
ответ нормальный, но если ключей много, то del не очень хорошая идея - person Girish; 08.01.2015
comment
да, но название темы предполагает, что это требование - хотя текст на нем неоднозначен - person Hans Z.; 08.01.2015
comment
Боюсь, у меня много ключей, поэтому я хочу внести в белый, а не в черный список. Я обновил заголовок, чтобы уточнить. - person Wilfred Hughes; 08.01.2015
comment
нет проблем, тогда вы должны принять другой ответ - person Hans Z.; 08.01.2015
comment
короче: map(del(["group","created"])), хотя это подходит только для черного списка - person mirabilos; 23.07.2018

Другое решение без функции map:

jq '[.[] | {name: .name}]'
person Mauricio Trajano    schedule 10.06.2016

Принятый ответ (с map) и эквивалентный ответ @mauricio-tranjano фактически добавят указанный ключ к объектам, у которых его еще нет. Если это не то поведение, которое вам нужно, рассмотрите возможность использования has(_), например:

$ jq -c 'map( if has("a") then {a} else {} end )'

Вход:

[{id:1,a:1}, {id:2}]

Выход:

[{"a":1},{}]
person peak    schedule 29.01.2017