Jak wybrać wiele pól w jq?

103

Mój plik wejściowy wygląda mniej więcej tak:

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

Mogę uzyskać wszystkie nazwy logowania za pomocą tego: cat members | jq '.[].login'

ale nie udało mi się złamać składni, aby uzyskać zarówno login, jak i identyfikator?

J. Groesser
źródło
Czy możesz podać przykład, jak powinien wyglądać oczekiwany wynik? Istnieje wiele sposobów przedstawiania par login / id.

Odpowiedzi:

145

Możesz użyć, jq '.[] | .login, .id'aby uzyskać każdy login, a następnie jego identyfikator.


źródło
1
Przykładowe dane wejściowe użytkowników wyglądają jak strumień obiektów, ale z powodu dostarczonego przez nich przykładowego skryptu zakładam, że jest on opakowany w tablicę, którą pominęli.
1
@SantiagoLapresta: Nie ma takiej potrzeby. jqdziała świetnie z sekwencją obiektów - nie ma potrzeby stosowania opakowania tablicy. Te ...ciągi i ostatni spływu usuwania przecinek potrzeba, ale uważam, że aby być dorozumiana.
Peter V. Mørch
56
Lub jeśli chcesz, aby były wyświetlane tylko te dwa pola. jq '.[] | {login, id}'
Cameron Taggart
4
@CameronTaggart, co jeśli chcę wyświetlić login.name? jq '.[] | {login.name, id}'wydaje się działać, jaki jest właściwy sposób, proszę?
zyxue
7
@zyxue To działa:jq '.[] | {name: .login.name, id}'
Alex Grounds
72

To działa dla mnie:

> echo '{"a":1,"b":2,"c":3}{"a":1,"b":2,"c":3}' | jq '{a,b}'
{
  "a": 1,
  "b": 2
}
{
  "a": 1,
  "b": 2
}
Peter V. Mørch
źródło
Jest to proste i dokładnie robi to, co chciałem zrobić: mieć wiele obiektów wejściowych / skrótów i pobierać tylko niektóre z nich, jednocześnie wyświetlając je jako obiekty.
Smar
11

Aby wybrać wartości, które są wcięte na różnych poziomach (tj. Zarówno na pierwszym, jak i na drugim poziomie), możesz użyć:

$ 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
źródło
4

Podaj tutaj jeszcze jeden przykład (jq-1.6):

Przejdź przez tablicę i wybierz pole elementu obiektu i pole obiektu w tym obiekcie

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"
}

Bez przykładowych danych:

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

.[]: przechodzenie przez tablicę

{id, name: .private_info.name}: weź .id i .private_info.name i zawiń je w obiekt o nazwach pól odpowiednio „id” i „name”

WYC
źródło
zawijanie w obiekt w celu zachowania nazw struktur / kluczy jest świetne, właśnie tego szukam
cryanbhu