2017-05-19 1 views
4

Ich habe die folgende DateiWie Newline bei jeder Iteration in jq bekommen

[ 
    { 
    "id": 1, 
    "name": "Arthur", 
    "age": "21" 
    }, 
    { 
    "id": 2, 
    "name": "Richard", 
    "age": "32" 
    } 
] 

Login und id zusammen anzuzeigen, ich bin mit dem folgenden Befehl

$ jq '.[] | .name' test 
"Arthur" 
"Richard" 

Aber wenn ich es in ein Shell-Skript und versuchen, es einer Variablen zuzuweisen, dann wird die gesamte Ausgabe in einer einzigen Zeile wie folgt angezeigt:

Ich möchte bei jeder Iteration brechen, ähnlich wie es in der Befehlszeile funktioniert.

Bitte helfen

+0

Beitrag der Code, wie Sie in einer Variablen – Inian

+0

zu speichern versucht, ich habe meine Frage bearbeitet und hinzugefügt, um das Skript als auch – user3198755

+1

Als Nebenwirkung: Der Grund für die Single-Line-Ausgang ist, dass Sie didn "$ names" in "echo $ names" wird nicht doppelt zitiert, wodurch die Shell die Worttrennung anwendet. Probiere 'echo" $ names "'. – mklement0

Antwort

4

Paar Fragen in den von Ihnen bereitgestellten Informationen. Der jq Filter .[] | .login, .id produziert nicht die Ausgabe, wie Sie auf jq-1.5 behaupteten. Für Ihre ursprüngliche JSON

{ 
    "login":"dmaxfield", 
    "id":7449977 
} 
{ 
    "login":"stackfield", 
    "id":2342323 
} 

wird es vier Zeilen der Ausgabe als produzieren

jq -r '.login, .id' < json 
dmaxfield 
7449977 
stackfield 
2342323 

Wenn Sie sie Seite bei der Speicherung von Seite interessiert sind, müssen Sie als

Variableninterpolation tun
jq -r '"\(.login), \(.id)"' < json 
dmaxfield, 7449977 
stackfield, 2342323 

Und wenn Sie glauben, dass Ihre Ausgabe in einer Variablen gespeichert ist, funktioniert nicht. Es ist wahrscheinlich wegen des Fehlens von Anführungszeichen, wenn Sie versuchten, die Variable in der Shell zu drucken.

jqOutput=$(jq -r '"\(.login), \(.id)"' < json) 
printf "%s\n" "$jqOutput" 
dmaxfield, 7449977 
stackfield, 2342323 

diese Weise die eingebetteten neuen Zeilen in der Befehlsausgabe sind nicht durch die Schale geschluckt.


Für Sie (im Vergleich zu alten völlig neue) JSON aktualisiert, alles, was Sie tun müssen, ist

jqOutput=$(jq -r '.[] | .name' < json) 
printf "%s\n" "$jqOutput" 
Arthur 
Richard 
+1

Es funktionierte wie Charme. Vielen Dank – user3198755

+0

@ user3198755: Antwort aktualisiert zu Ihrem aktualisierten 'JSON'. Danke und glücklich zu helfen! – Inian

0

Falls die .login oder .id eingebettete Leerzeichen enthält oder andere Zeichen, die Macht Probleme verursachen, ist ein robuster Ansatz, um sicherzustellen, dass jeder JSON-Wert in einer separaten Zeile ist. Betrachten wir zum Beispiel:

jq -c .login,.id input.json | while read login ; do read id; echo login="$login" and id="$id" ; done 
login="dmaxfield" and id=7449977 
login="stackfield" and id=2342323 
Verwandte Themen