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

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

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

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

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


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


Ответы (4)


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

person Community    schedule 17.01.2016
comment
Образец ввода пользователей действительно выглядит как поток объектов, но из-за предоставленного ими образца сценария я предполагаю, что он заключен в массив, который они пропустили. - person ; 17.01.2016
comment
@SantiagoLapresta: В этом предположении нет необходимости. jq отлично работает с последовательностью объектов - нет необходимости в оболочке массива. Строки ... и последнюю запятую нужно удалить, но я считаю, что это подразумевается. - person Peter V. Mørch; 22.06.2017
comment
jq '.[] | .login, .id' - это создает две выходные записи, одну для .login и одну для .id. - person Peter V. Mørch; 22.06.2017
comment
Или если вы хотите, чтобы отображались только эти два поля. jq '.[] | {login, id}' - person Cameron Taggart; 05.08.2017
comment
@CameronTaggart, а что, если я хочу отобразить login.name? jq '.[] | {login.name, id}', похоже, работает, пожалуйста, как правильно? - person zyxue; 10.10.2018
comment
@zyxue Я опубликовал решение, которое будет работать для выбора полей с отступом (см. ниже) - person vreyespue; 03.04.2019
comment
@zyxue Это работает: jq '.[] | {name: .login.name, id}' - person Alex Grounds; 18.09.2019
comment
это не сработает, если я попытаюсь сохранить вывод, отсортированный по отображаемому имени, например jq ".services[] | .displayName, .serviceId" services.json | sort -f - person cryanbhu; 22.10.2020

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

> echo '{"a":1,"b":2,"c":3}{"a":1,"b":2,"c":3}' | jq '{a,b}'
{
  "a": 1,
  "b": 2
}
{
  "a": 1,
  "b": 2
}
person Peter V. Mørch    schedule 22.06.2017
comment
Это просто и делает именно то, что я хотел: иметь несколько входных объектов / хэшей и принимать только некоторые из них, а также выводить их как объекты. - person Smar; 04.01.2021
comment
Теперь я могу использовать это на своих цифровых фотографиях: ls *jpg | xargs -n 1 exiftool -json | jq '{ SourceFile,CreateDate,CreationDate,Make,Model,DateTimeOriginal,SceneType,FileAccessDate,FileModifyDate,FileInodeChangeDate,SceneCaptureType,ModifyDate }' - person Sridhar Sarnobat; 19.05.2021
comment
Обратите внимание, что вы не ставите перед атрибутом префикс .. Мне потребовалось время, чтобы осознать это. - person Sridhar Sarnobat; 05.06.2021

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

$ 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
]
person vreyespue    schedule 03.04.2019

Просто приведите здесь еще один пример (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 и оберните их в объект с идентификатором и именем поля соответственно

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