LoginSignup
1

More than 1 year has passed since last update.

JSON配列をシェルスクリプトで一覧に変換

Last updated at Posted at 2021-07-13
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 文。その他、各コマンドの詳細は、echocatexpr

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1