覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

jqで基礎的な操作をしてみる

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



関連エントリ