Як вибрати кілька полів у 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
]

3

Просто наведіть ще один приклад тут (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.