前回、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
コマンドは備えています。
もっと使いこなせるようになりたいです。
関連エントリ