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.
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 aufDies 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"
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
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"
Probieren Sie Folgendes aus Geben Sie die gewünschte Ausgabe
echo '{"123":"abc","231":"dbh","452":"xyz"}' | jq -r 'to_entries | .[] | "\"" + .key + "\",\"" + (.value | tostring)+ "\""'