Как выбрать несколько полей в jq

97

Мой входной файл выглядит примерно так:

{
"login": "dmaxfield",
"id": 7449977,
...
}
{
"login": "dmaxfield",
"id": 7449977,
...
}

Я могу получить все имена для входа с помощью этого: cat members | jq '.[].login'

но мне не удалось взломать синтаксис, чтобы получить и логин, и идентификатор?

J. Groesser
источник
Можете ли вы привести пример того, как должен выглядеть ваш ожидаемый результат? Есть много способов, которыми могут быть представлены пары логин / идентификатор.

Ответы:

138

Вы можете использовать jq '.[] | .login, .id'для получения каждого логина, за которым следует его идентификатор.


источник
1
Образец ввода пользователей действительно выглядит как поток объектов, но из-за предоставленного ими образца сценария я предполагаю, что он заключен в массив, который они пропустили.
1
@SantiagoLapresta: В этом предположении нет необходимости. jqотлично работает с последовательностью объектов - нет необходимости в оболочке массива. Эти ...строки и последний трейлинг удаление запятой нужно, но я считаю , что подразумевается.
Peter V. Mørch
55
Или если вы хотите, чтобы отображались только эти два поля. jq '.[] | {login, id}'
Кэмерон Таггарт,
4
@CameronTaggart, а что, если я хочу отобразить login.name? jq '.[] | {login.name, id}'кажется, работает, пожалуйста, как правильно?
zyxue
6
@zyxue Это работает:jq '.[] | {name: .login.name, id}'
Alex Grounds
64

Это работает для меня:

> echo '{"a":1,"b":2,"c":3}{"a":1,"b":2,"c":3}' | jq '{a,b}'
{
  "a": 1,
  "b": 2
}
{
  "a": 1,
  "b": 2
}
Питер В. Мёрч
источник
10

Чтобы выбрать значения с отступом на разные уровни (т.е. как первый, так и второй уровень), вы можете использовать следующее:

$ echo '[{"a":{"aa":1,"ab":2},"b":3,"c":4},{"a":{"aa":5,"ab":6},"b":7,"c":8}]'|jq '.[]|[.a.aa,.a.ab,.b]'

[
  1,
  2,
  3
]
[
  5,
  6,
  7
]
Vreyespue
источник
2

Просто приведите здесь еще один пример (jq-1.6):

Пройдитесь по массиву и выберите поле элемента объекта и поле объекта в этом объекте.

echo '[{"id":1, "private_info": {"name": "Ivy", "age": 18}}, {"id":2, "private_info": {"name": "Tommy", "aga": 18}}]' | jq ".[] | {id: .id, name: .private_info.name}" -

{
  "id": 1,
  "name": "Ivy"
}
{
  "id": 2,
  "name": "Tommy"
}

Без данных примера:

jq ".[] | {id, name: .private_info.name}" -

.[]: пройти по массиву

{id, name: .private_info.name}: взять .id и .private_info.name и обернуть их в объект с именем поля "id" и "name" соответственно

WYC
источник
обертывание в объект для сохранения структуры / ключевых имен - это здорово, именно то, что я ищу
cryanbhu