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


97

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

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

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

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


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

Ответы:


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


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
]

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" соответственно


обертывание в объект для сохранения структуры / ключевых имен - это здорово, именно то, что я ищу
cryanbhu
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.