geonames からロンドンの郵便番号データを照会しています。
http://www.geonames.org/postalcode-search.html?q=london&country=GB
出力を郵便番号識別子 (Bethnal Green、Islington など) だけのリストに変換したいと考えています。bashで名前だけを抽出する最良の方法は何ですか?
geonames からロンドンの郵便番号データを照会しています。
http://www.geonames.org/postalcode-search.html?q=london&country=GB
出力を郵便番号識別子 (Bethnal Green、Islington など) だけのリストに変換したいと考えています。bashで名前だけを抽出する最良の方法は何ですか?
\n
この区切られたリスト (または括弧内のカンマ区切り) を意味するかどうかはわかりません
html='http://www.geonames.org/postalcode-search.html?q=london&country=GB'
wget -q "$html" -O - |
w3m -dump -T 'text/html'|
sed -nr 's/^ +[0-9]+ +(.*) +[A-Z]+[0-9]+ +United Kingdom.*/\1/p'
w3m
は、「優れたテーブル/フレームをサポートする WWW ブラウズ可能なページャー」です。
出力 (最初の 10 行)
London Bridge
Kilburn
Ealing
Wandsworth
Pimlico
Kensington
Leyton
Leytonstone
Plaistow
Poplar
このサイトでは (無料ではありませんが) XML または JSON データを使用した Web サービスを提供しています... HTML ページは (簡単に) 解析することを意図していないため、これが最善の方法です。
とにかく、不可能なことは何もありませんが、厳密に bash コマンドだけを使用することは、不可能ではないにしても非常に困難です。多くの場合、結果を達成するために、他のいくつかの一般的なツールがパイプされます。しかし、cat、grep、awk、sed などを組み合わせるよりも、Perl などの単一のツールに固執する方が便利な場合があります。
何かのようなもの
sed -e 's/>/>\n/g' region.html |
egrep -i "^\s*[A-Z]+[0-9]+</td>" |
sed -e 's|</td>||g'
コードの特定の形式を想定して、200行を抽出しました。
追加
データの解析に使用できるソフトウェアに制限がない場合は、次のような行を使用できます
wget -q "http://www.geonames.org/postalcode-search.html?q=london&country=GB" -O - |
sgrep '"<table class=\"restable\"" .. "</table>"' |
sed -e 's|/tr>|/tr>\n|g; s|</td>\s*<td[^>]*>|;|g; s|</th>\s*<th[^>]*>|;|g; s|<[^>]\+>||g; s|;; .*$| |g' |
grep -v "^\s*$" |
tail -n+2 | cut -d";" -f2,3
;
これは、CSV 内の like で区切られた場所と郵便番号、および awk を抽出します。
wget -q "$html" -O - |
w3m -dump -T 'text/html' |
awk '/\s*[0-9]+ / { print substr($0, 11, 16); }'
これは、Peter.O による回答に基づいており、同じデータを抽出します...など。しかし、これらの場合、ほとんどの Unix や GNU システムに見られる最小限のツールに限定されないため、perl などの 1 つの広く普及しているツールに固執します。
mojo
Mojolicious プロジェクトのツールにアクセスできる場合、これはすべて非常に簡単になります。
mojo get 'http://www.geonames.org/postalcode-search.html?q=london&country=GB' '.restable > tr > td:nth-child(2)' text | grep ^'[a-zA-Z]'
最後のgrep
は、一部の不要な結果を除外するだけです。ページ構造に若干の一貫性がないため、ほとんど (完全ではない) 1 行おきに問題があります。それ以外の場合はtr:nth-child(even)
、良い結果を得ることができます。