テキスト処理
以下のページも参照のこと。
目次
一行野郎
最長行の長さを求める
AWK のマニュアルにも載っている、基礎的な一行。
$ awk '{ if (max > length()) max = length() } END { print max }' FILE
テキストファイルを横に連結
これは paste コマンドを知っているかどうか。
$ paste FILE1 FILE2
頻出コマンド Top 10
ぜんぜん役には立たないが、パイプの真骨頂が味わえる、趣き深い一行。
$ history | awk '{ print $2 }' | sort | uniq -c | sort -nr | head -n 10
IP アドレス的なもの抽出
面倒なので、先頭の 0 も許す。
$ egrep -o '([0-9]{1,3}\.){3}[0-9]{1,3}' FILE
URL 的なもの抽出
使える記号は適当に。
$ egrep -o '[a-z]+://[[:alnum:]:;/._!?~%#&=+-]+'
文字単位で逆順に出力
行単位で逆順に出力する場合は、cat の反対である
$ tac FILE
でよいが、これじゃあ生ぬるい (何が)。文字単位で逆転させようじゃないか。
$ tac -rs '[^@]' FILE
@ はファイル中に出現していない文字に置き換えること。 要するに、ファイル中のすべての文字を区切り文字として逆転させている。
大文字・小文字変換
小文字をすべて大文字に変換する。下記はどちらも同じ結果を得る。
$ tr 'a-z' 'A-Z' < FILE $ awk '{ print toupper($0) }' FILE
ランダムに 1 行出力
0 <= rand() < 1
であることに注意。
$ awk '{l[NR]=$0} END{srand();print l[int((rand()*NR))+1]}' FILE
区切り文字を変換
たぶん tr が一番簡単。
$ tr -s ' ' ',' < FILE
行番号を付ける
以下はどちらもほぼ同等。特に nl は細かい設定ができるようだが、これは man 参照のこと。
$ cat -n FILE $ nl -ba FILE
最初の N 行をカットする
$ tail -n +$((N+1)) FILE
要するに、1 行目だけいらない (2 行目以降を出力したい) 場合、
$ tail -n +2 FILE
あ、awk でもいいか。こっちの方がわかりやすいし。
$ awk 'NR > 1' FILE
行を長さ順にソート
これ、意外と難しい。もっと美しい方法があるはず。。
$ awk '{printf("%4d ",length()); print}' FILE | sort -n | cut -c 6-
企画モノ
高効率単語帳メーカー (構想中)
高効率単語帳とは、英語の文書や文献データベースに頻出する単語とその意味を列挙した単語帳である。 頻出するが知らない単語から学習していくことで、その文献に対する読解力を効率的に上げることが可能… のはず。
自動生成に必要なパーツを考えてみよう。
- クローラ
- HTML タグなどの不要部分削除
- 英単語抽出
- 英単語数え上げ
- 不要英単語削除 (the, is など。手作業か?)
- 単語の意味抽出
- 統合・整形
といったところか。
まずは Red Hat Bugzilla の高効率単語帳メーカを作ることにしよう。
ポリシーは「できるだけプログラミングしない」こと。 bash と Linux のコマンドを駆使してどこまでできるか挑戦してみる。
クローラ
Red Hat Bugzilla では、URL が以下の形式になっているのでクロールするのは簡単そうだ。
https://bugzilla.redhat.com/show_bug.cgi?id=100
これは bash と curl ですぐにできるだろう。
#!/bin/bash for id in $(seq 250001 251000); do curl -o html/$id.html "https://bugzilla.redhat.com/show_bug.cgi?id=$id" sleep 5 # これを短くしてはいけない done
HTML タグをカットしながら保存した方が効率的だが、後のことも考えて今はそのまま保存することにしよう。 とりあえず 1000 ページ取得することにして、続きはまた今度。