前回、jq
コマンドをインストールしました。
基礎的な操作だけ試しておきます。
仮に person.json というファイルの内容が以下のようになっているとします
{ "name": { "first" : "taro", "last": "yamada" }, "age": 20 }
これを整形して表示する場合は以下になります
cat person.json | jq .
出力結果は以下の通りで整形されています。
{ "name": { "first": "taro", "last": "yamada" }, "age": 20 }
このJSONから「name」項目を取得したい場合は以下です
cat person.json | jq .name
出力結果は以下の通りで整形されています。
{ "first": "taro", "last": "yamada" }
「name」の中の 「first」の値だけ取りたいときは以下になります
cat person.json | jq .name
出力結果は以下の通り
"taro"
このやり方が望ましいかわかりませんが以下でもいけますね
cat person.json | jq .name | jq .first
出力結果は以下の通り
"taro"
出力結果を囲んでいるダブルクォートが邪魔な場合は -r
オプションをつけます
cat person.json | jq -r .name
出力結果は以下の通り
taro
「name.first」 と 「name.last」 を結合した結果を出力してみます
cat person.json | jq .name | jq -r '.first + " " + .last'
出力結果は以下の通り
taro yamada
少し複雑めなJSONを操作
$ curl -s "http://geoapi.heartrails.com/api/json?method=searchByPostal&postal=1060032" | jq . { "response": { "location": [ { "city": "港区", "city_kana": "みなとく", "town": "六本木一丁目", "town_kana": "ろっぽんぎ1ちょうめ", "x": "139.740991", "y": "35.665082", "prefecture": "東京都", "postal": "1060032" }, { "city": "港区", "city_kana": "みなとく", "town": "六本木二丁目", "town_kana": "ろっぽんぎ2ちょうめ", "x": "139.737087", "y": "35.666974", "prefecture": "東京都", "postal": "1060032" }, { "city": "港区", "city_kana": "みなとく", "town": "六本木三丁目", "town_kana": "ろっぽんぎ3ちょうめ", "x": "139.735452", "y": "35.663977", "prefecture": "東京都", "postal": "1060032" }, { "city": "港区", "city_kana": "みなとく", "ç": "六本木四丁目", "town_kana": "ろっぽんぎ4ちょうめ", "x": "139.733837", "y": "35.665489", "prefecture": "東京都", "postal": "1060032" }, { "city": "港区", "city_kana": "みなとく", "town": "六本木五丁目", "town_kana": "ろっぽんぎ5ちょうめ", "x": "139.735248", "y": "35.658358", "prefecture": "東京都", "postal": "1060032" }, { "city": "港区", "city_kana": "みなとく", "town": "六本木六丁目", "town_kana": "ろっぽんぎ6ちょうめ", "x": "139.729932", "y": "35.659856", "prefecture": "東京都", "postal": "1060032" }, { "city": "港区", "city_kana": "みなとく", "town": "六本木七丁目", "town_kana": "ろっぽんぎ7ちょうめ", "x": "139.726863", "y": "35.664751", "prefecture": "東京都", "postal": "1060032" } ] } }
上記の中から「town」だけ列挙してみる
curl -s "http://geoapi.heartrails.com/api/json?method=searchByPostal&postal=1060032" | jq .response.location[].town "六本木一丁目" "六本木二丁目" "六本木三丁目" "六本木四丁目" "六本木五丁目" "六本木六丁目" "六本木七丁目"
当初取得した値の中から 「town」,「x」, 「y」だけのJSONにしたい場合は map
使うと可能です
$ curl -s "http://geoapi.heartrails.com/api/json?method=searchByPostal&postal=1060032" | jq '.response.location | map({town: .town, x: .x, y: .y})' [ { "town": "六本木一丁目", "x": "139.740991", "y": "35.665082" }, { "town": "六本木二丁目", "x": "139.737087", "y": "35.666974" }, { "town": "六本木三丁目", "x": "139.735452", "y": "35.663977" }, { "town": "六本木四丁目", "x": "139.733837", "y": "35.665489" }, { "town": "六本木五丁目", "x": "139.735248", "y": "35.658358" }, { "town": "六本木六丁目", "x": "139.729932", "y": "35.659856" }, { "town": "六本木七丁目", "x": "139.726863", "y": "35.664751" } ]
まとめ
まとめるほど触ってませんが、まだまだ相当な機能やオプションをjq
コマンドは備えています。
もっと使いこなせるようになりたいです。