私はこのようなオブジェクトを変換しようとしています:
{
"123" : "abc",
"231" : "dbh",
"452" : "xyz"
}
次のようなcsvへ:
"123","abc"
"231","dbh"
"452","xyz"
コマンドラインツール jq を使用したいと思いますが、割り当ての方法がわからないようです。私はjq '. | keys' test.json
でキーを取得できましたが、次に何をすべきかわかりませんでした。
問題は、このようなk:vオブジェクトを@csv
で直接csvに変換できないことです。配列である必要があるため、最初に配列に変換する必要があります。キーに名前が付けられている場合、それは単純ですが、動的であるためそれほど簡単ではありません。
このフィルターを試してください:
to_entries[] | [.key, .value]
to_entries
は、オブジェクトをキー/値オブジェクトの配列に変換します。 []
は、配列を配列内の各アイテムに分割しますこれにより、次の出力が生成されます。
[
"123",
"abc"
],
[
"231",
"dbh"
],
[
"452",
"xyz"
]
次に、@csv
フィルタを使用して、行をCSV行に変換します。
$ echo '{"123":"abc","231":"dbh","452":"xyz"}' | jq -r 'to_entries[] | [.key, .value] | @csv'
"123","abc"
"231","dbh"
"452","xyz"
これが私が今朝使用することになった例です(PagerDutyアラートの処理):
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") '
次のようなCVSで区切られたドキュメントをダンプします:"[Triggered] Something annoyingly frequent",31 "[Triggered] Even more frequent alert!",35 "[No data] Stats Server is probably acting up",55
ジェフの答えは良い出発点であり、あなたが期待するものに近いものです:
cat input.json | jq 'to_entries | map([.key, .value]|join(","))'
[
"123,abc",
"231,dbh",
"452,xyz"
]
しかし、改行を使用して参加する方法が見つかりませんでした:
cat input.json | jq 'to_entries | map([.key, .value]|join(","))|join("\n")'
"123,abc\n231,dbh\n452,xyz"
これを試してくださいあなたが望む同じ出力を与える
echo '{"123":"abc","231":"dbh","452":"xyz"}' | jq -r 'to_entries | .[] | "\"" + .key + "\",\"" + (.value | tostring)+ "\""'