wake-up-neo.com

Wie kann ein Objekt Arrays zugeordnet werden, damit es in CSV konvertiert werden kann?

Ich versuche ein Objekt zu konvertieren, das so aussieht:

{
  "123" : "abc",
  "231" : "dbh",
  "452" : "xyz"
}

Zu csv sieht das so aus:

"123","abc"
"231","dbh"
"452","xyz"

Ich würde es vorziehen, das Befehlszeilentool jq zu verwenden, kann jedoch nicht herausfinden, wie die Zuweisung ausgeführt wird. Ich habe es geschafft, die Schlüssel mit jq '. | keys' test.json zu bekommen, konnte aber nicht herausfinden, was ich als Nächstes tun sollte.

Das Problem ist, dass Sie ein k: v-Objekt mit @csv nicht direkt in csv konvertieren können. Es muss ein Array sein, also müssen wir zuerst in ein Array konvertieren. Wenn die Schlüssel benannt würden, wäre dies einfach, aber sie sind dynamisch, so dass es nicht so einfach ist.

24
Louis

Versuchen Sie diesen Filter:

to_entries[] | [.key, .value]
  • to_entries konvertiert ein Objekt in ein Array von Schlüssel-/Wertobjekten. [] teilt das Array in jedes Element des Arrays auf
  • covert dann für jedes Element ein Array, das den Schlüssel und den Wert enthält.

Dies erzeugt die folgende Ausgabe:

[
  "123",
  "abc"
],
[
  "231",
  "dbh"
],
[
  "452",
  "xyz"
]

Dann können Sie den Filter @csv verwenden, um die Zeilen in CSV-Zeilen zu konvertieren.

$ echo '{"123":"abc","231":"dbh","452":"xyz"}' | jq -r 'to_entries[] | [.key, .value] | @csv'
"123","abc"
"231","dbh"
"452","xyz"
35
Jeff Mercado

Hier ist ein Beispiel, das ich heute morgen verwendet habe (Verarbeitung von PagerDuty-Alarmen):

cat /tmp/summary.json | jq -r '
  .incidents
  | map({desc: .trigger_summary_data.description, id:.id})
  | group_by(.desc)
  | map(length as $len
  | {desc:.[0].desc, length: $len}) 
  | sort_by(.length) 
  | map([.desc, .length] | @csv)
  | join("\n") '

Dadurch wird ein von CVS getrenntes Dokument abgelegt, das etwa wie folgt aussieht: "[Triggered] Something annoyingly frequent",31 "[Triggered] Even more frequent alert!",35 "[No data] Stats Server is probably acting up",55

4
Jón Tómas

Jeff Antwort ist ein guter Ausgangspunkt, etwas näher an dem, was Sie erwarten:

cat input.json | jq 'to_entries | map([.key, .value]|join(","))'

[
 "123,abc",
 "231,dbh",
 "452,xyz"
]

Ich habe aber keinen Weg gefunden, um mit newline zu arbeiten:

cat input.json | jq 'to_entries | map([.key, .value]|join(","))|join("\n")'

"123,abc\n231,dbh\n452,xyz"
1
tomsoft

Probieren Sie Folgendes aus Geben Sie die gewünschte Ausgabe

echo '{"123":"abc","231":"dbh","452":"xyz"}' | jq -r 'to_entries | .[] | "\"" + .key + "\",\"" + (.value | tostring)+ "\""'
0
Sunil shakya