次のような(辞書?)JSONファイルがあります。
{
"Salad": {
"name": "Dressing",
"good": true,
"status": true
},
"Data_XML": {
"name": "XML",
"good": false
},
"Functionality": {
"name": "FUNC",
"good": true
},
"Data_JSON": {
"name": "JSON",
"good": true,
"status": false
}
}
次のCSV出力を探しています。
"title","good","name","status"
"Salad",true,"Dressing",true
"Data_XML",false,"XML",""
"Functionality",true,"FUNC",""
"Data_JSON",true,"JSON",false
何私が見つけた私が今まで使ってきた方法です。
jq -r '(map(keys_unsorted) | add | unique) as $cols | $cols, map(. as $row | $cols | map($row[.]))[] | @csv'
出力:
"good","name","status"
true,"Dressing",true
false,"XML",
true,"FUNC",
true,"JSON",false
私は同等のものが必要ですサラダ、Data_XML、関数、Data_JSON〜のように列1(ソートされていない)と関連データ。
については「良い」、「名前」、「状態」これはヘッダーフィールドになり、ランダムなので動的に検索する必要があります(データセットごとに4つあり、他のデータセットには10個あります)。これは比較的大きなファイルであり、「タイトル」を最初の列ヘッダー項目として残すため、手動で解析することは困難です。「タイトル」、「良い」、「名前」、「ステータス」、「何か」、「その他」、「ランダム」、「その他」
とても近いようです…どんな助けでも大変感謝します!
答え1
私はこれがうまくいくと思います:
jq -r '["title","name","good","status"],(to_entries|.[]|
[.key,.value.good,.value.name,
(if .value.status == null then "" else .value.status end )]
)|@csv'
新しいバージョンはさらに多様化しました。
jq -r ' to_entries as $row |
( ( map(keys_unsorted ) | add | unique ) as $cols |
( ["title" , $cols] | flatten) ,
( $row | .[] as $onerow | $onerow |
( [ .key , ( $cols |
map ($onerow.value[.] as $v | if $v == null then "" else $v end ) ) ]
| flatten ) ) ) | @csv '