Wie wähle ich mehrere Felder in jq aus?


97

Meine Eingabedatei sieht ungefähr so ​​aus:

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

Ich kann alle Anmeldenamen damit erhalten: cat members | jq '.[].login'

aber ich konnte die Syntax nicht knacken, um sowohl das Login als auch die ID zu erhalten?


Können Sie ein Beispiel dafür geben, wie Ihre erwartete Ausgabe aussehen sollte? Es gibt viele Möglichkeiten, wie die Login / ID-Paare dargestellt werden können.

Antworten:


138

Sie können jq '.[] | .login, .id'jedes Login gefolgt von seiner ID abrufen.


1
Die Beispieleingabe der Benutzer sieht zwar wie ein Strom von Objekten aus, aber aufgrund des von ihnen bereitgestellten Beispielskripts gehe ich davon aus, dass sie in ein Array eingeschlossen sind, das sie weggelassen haben.

1
@ SantiagoLapresta: Diese Annahme ist nicht erforderlich. jqfunktioniert hervorragend mit einer Folge von Objekten - der Array-Wrapper ist nicht erforderlich. Die ...Zeichenfolgen und das letzte nachfolgende Komma müssen entfernt werden, aber ich halte das für impliziert.
Peter V. Mørch

55
Oder wenn nur diese beiden Felder angezeigt werden sollen. jq '.[] | {login, id}'
Cameron Taggart

4
@CameronTaggart, was ist, wenn ich anzeigen möchte login.name? jq '.[] | {login.name, id}'scheint zu funktionieren, was ist der richtige Weg, bitte?
Zyxue

6
@zyxue Dies funktioniert:jq '.[] | {name: .login.name, id}'
Alex Grounds

64

Das funktioniert bei mir:

> 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

Um Werte auszuwählen, die auf verschiedenen Ebenen eingerückt sind (dh sowohl auf der ersten als auch auf der zweiten Ebene), können Sie Folgendes verwenden:

$ 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

Geben Sie hier nur ein weiteres Beispiel an (jq-1.6):

Gehen Sie durch ein Array und wählen Sie ein Feld eines Objektelements und ein Objektfeld in diesem Objekt aus

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

Ohne die Beispieldaten:

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

.[]: Gehen Sie durch ein Array

{id, name: .private_info.name}: Nehmen Sie .id und .private_info.name und wickeln Sie es in ein Objekt mit den Feldnamen "id" bzw. "name" ein


Das Einwickeln in ein Objekt, um Struktur- / Schlüsselnamen beizubehalten, ist großartig, genau das, wonach ich suche
cryanbhu
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.