sample.json
{
"Japan": [
{
"Region" : "Kanto",
"Prefecture" : [
{ "Name": "Tokyo", "Capital": "Shinjuku" },
{ "Name": "Kanagawa", "Capital": "Yokohama" }
]
},
{
"Region" : "Kansai",
"Prefecture" : [
{ "Name": "Osaka", "Capital": "Osaka" },
{ "Name": "Kyoto", "Capital": "Kyoto" },
{ "Name": "Hyogo", "Capital": "Kobe" }
]
},
{
"Region" : "Other",
"Prefecture" : [
{ "Name": "Hokkaido", "Capital": "Sapporo" },
{ "Name": "Aichi", "Capital": "Nagoya" },
{ "Name": "Fukuoka", "Capital": "Fukuoka" }
]
}
]
}
上記 sample.json のJSON配列を、jq コマンド を使ったシェルスクリプトで下記一覧に変換。
Region | PrefectureName | PrefectureCapital |
---|---|---|
Kanto | Tokyo | Shinjuku |
Kanto | Kanagawa | Yokohama |
Kansai | Osaka | Osaka |
Kansai | Kyoto | Kyoto |
Kansai | Hyogo | Kobe |
Other | Hokkaido | Sapporo |
Other | Aichi | Nagoya |
Other | Fukuoka | Fukuoka |
ShellScript
#!/bin/bash
# 出力ファイルのヘッダを用意
echo "Region,PrefectureName,PrefectureCapital" > japan.csv
# Japan内のオブジェクトを取得
Japan=`cat sample.json | jq .[]`
# Japan内の配列数を取得
JapanLength=`echo $Japan | jq length`
# i の値がJapan内の配列数以下である限りループ
for ((i=0; i<=`expr $JapanLength - 1`; i++)) do
# 配列の要素はゼロ番目から開始
# jq -r ".[0].Region" の場合 Kanto を取得
Region=`echo $Japan | jq -r ".[$i].Region"`
# jq -r ".[0].Prefecture" の場合 Tokyo と Kanagawa ふたつの要素を取得
Prefecture=`echo $Japan | jq ".[$i].Prefecture"`
# i 番目の配列の要素内にある、配列数を取得
# jq -r ".[0].Prefecture" の場合、配列数は2
PrefectureLength=`echo $Prefecture | jq length`
# j の値がPrefecture内の配列数以下である限りループ
for ((j=0; j<=`expr $PrefectureLength - 1`; j++)) do
# jq -r ".[0].Prefecture[0].Name" の場合 Tokyo を取得
# jq -r ".[1].Prefecture[1].Name" の場合 Kyoto を取得
PrefectureName=`echo $Japan | jq -r ".[$i].Prefecture[$j].Name"`
# jq -r ".[0].Prefecture[1].Capital" の場合 Yokohama を取得
# jq -r ".[2].Prefecture[0].Capital" の場合 Sapporo を取得
PrefectureCapital=`echo $Japan | jq -r ".[$i].Prefecture[$j].Capital"`
# 取得した各配列の要素をカンマ区切りでCSVファイルとして出力
echo $Region,$PrefectureName,$PrefectureCapital >> japan.csv
done
done
japan.csv への出力時の >
や >>
についての詳細は、標準入出力のリダイレクト。
for
文についての詳細は、算術式の for 文。その他、各コマンドの詳細は、echo、cat、expr。