gawk で「最寄り駅Webサービス」

LL Future のプロモーションビデオに出てくる「最寄り駅Webサービス」の API を使った最寄り駅検索は既にご覧になられたでしょうか?

同じ物を gawk で作ってみたいと思います。簡単な API のため gawk からも簡単に呼び出すことができます。

#! /usr/bin/gawk -f
# moyorieki.awk - use "moyori eki web service" api.

BEGIN {
    ORS = RS = "\r\n\r\n";
    base_url = "map.simpleapi.net";
    url = "stationapi";
    http_url = "/inet/tcp/0/" base_url "/80";
    str = "GET http://" base_url "/" url "?p=" ARGV[1];
    print str " HTTP/1.0" |& http_url;
    while ((http_url |& getline) > 0) {
        print $0 > "moyorieki.txt";
    }
    close(http_url);
    close("moyorieki.txt");
    ORS = RS = "\n";
    while (getline < "moyorieki.txt" > 0) {
        if ($0 ~ /\%PAGE_BODY%lt;name\%PAGE_BODY%gt;/) {
            sub(/<[a-z]*>/, ""); sub(/<\/[a-z]*>/, ""); sub(/^ */, "");
            idx = $0;
            station[idx] = $0;
        }
        if ($0 ~ /\%PAGE_BODY%lt;line\%PAGE_BODY%gt;/) {
            sub(/<[a-z]*>/, ""); sub(/<\/[a-z]*>/, ""); sub(/^ */, "");
            line[idx] = $0;
        }
        if ($0 ~ /\%PAGE_BODY%lt;direction\%PAGE_BODY%gt;/) {
            sub(/<[a-z]*>/, ""); sub(/<\/[a-z]*>/, ""); sub(/^ */, "");
            direction[idx] = $0;
        }
        if ($0 ~ /\%PAGE_BODY%lt;distanceM\%PAGE_BODY%gt;/) {
            sub(/<[a-zA-Z]*>/, ""); sub(/<\/[a-zA-Z]*>/, ""); sub(/^ */, "");
            distance[idx] = $0;
        }
        if ($0 ~ /\%PAGE_BODY%lt;traveltime\%PAGE_BODY%gt;/) {
            sub(/<[a-zA-Z]*>/, ""); sub(/<\/[a-zA-Z]*>/, ""); sub(/^ */, "");
            traveltime[idx] = $0;
        }
    }
    close("moyorieki.txt");
    for (i in station) {
        print station[i] "(" line[i] ") " direction[i] " "\
              distance[i] " " traveltime[i];
    }
}

使い方も同じように引数に地名を使います。

$ gawk -f moyorieki.awk なかのzero
東中野駅(JR中央本線ほか) 東 1,240m 徒歩17分以上
中野駅(JR中央本線ほか) 南西 820m 徒歩11分以上
新井薬師前駅(西武新宿線) 北 1,230m 徒歩17分以上
中野坂上駅(東京メトロ丸ノ内線ほか) 南東 1,280m 徒歩18分以上
中野新橋駅(東京メトロ丸ノ内線(方南町支線)) 南 1,420m 徒歩20分以上
新中野駅(東京メトロ丸ノ内線) 南西 830m 徒歩11分以上

gawk の機能だけを使っているため、XML の扱いがイマイチですが、gawk は実行ファイルひとつで全ての機能が使えるため、他の言語よりも環境を選ばないと言えるでしょう。

ちなみに改行コードが "\n" であっても認識しているようなので、以下のようなコードでも同じ結果が得られました。

#! /usr/bin/gawk -f
# moyorieki.awk - use "moyori eki web service" api.

BEGIN {
    base_url = "map.simpleapi.net";
    url = "stationapi";
    http_url = "/inet/tcp/0/" base_url "/80";
    str = "GET http://" base_url "/" url "?p=" ARGV[1];
    print str " HTTP/1.0" |& http_url;
    print "" |& http_url;
    while ((http_url |& getline) > 0) {
        if ($0 ~ /\%PAGE_BODY%lt;name\%PAGE_BODY%gt;/) {
            sub(/<[a-z]*>/, ""); sub(/<\/[a-z]*>/, ""); sub(/^ */, "");
            idx = $0;
            station[idx] = $0;
        }
        if ($0 ~ /\%PAGE_BODY%lt;line\%PAGE_BODY%gt;/) {
            sub(/<[a-z]*>/, ""); sub(/<\/[a-z]*>/, ""); sub(/^ */, "");
            line[idx] = $0;
        }
        if ($0 ~ /\%PAGE_BODY%lt;direction\%PAGE_BODY%gt;/) {
            sub(/<[a-z]*>/, ""); sub(/<\/[a-z]*>/, ""); sub(/^ */, "");
            direction[idx] = $0;
        }
        if ($0 ~ /\%PAGE_BODY%lt;distanceM\%PAGE_BODY%gt;/) {
            sub(/<[a-zA-Z]*>/, ""); sub(/<\/[a-zA-Z]*>/, ""); sub(/^ */, "");
            distance[idx] = $0;
        }
        if ($0 ~ /\%PAGE_BODY%lt;traveltime\%PAGE_BODY%gt;/) {
            sub(/<[a-zA-Z]*>/, ""); sub(/<\/[a-zA-Z]*>/, ""); sub(/^ */, "");
            traveltime[idx] = $0;
        }
    }
    close(http_url);
    for (i in station) {
        print station[i] "(" line[i] ") " direction[i] " "\
              distance[i] " " traveltime[i];
    }
}

tag_gawk.pngtag_gawk.png