Another introduction to programming language C 11: 【番外編】文書中の単語を出現頻度順に表示するプログラム

CウィザードとUNIXハッカーはある時代まで同義語であった.

いま,こんな問題があるとしよう.

「テキストファイルinput.txt中の単語を出現頻度順に,出現頻度ともに印刷せよ.大文字と小文字は区別しない.句読点以外の特殊文字は登場しない.」

どうするだろうか?Cウィザード(UNIXハッカー)なら,まずプログラムを書く前に,手持ちのツールを組み合わせられないかを考える.事実,Cウィザードなら次のようなコマンドをすらすらと書くだろう.

$ cat input.txt | tr [A-Z] [a-z] | tr -cs [a-z] '\n' | sort | uniq -c | sort -nr > output.txt

あとはoutput.txtをmoreなりheadなりで表示させて満足するのである.

これらのコマンドを解説しよう.

trコマンドは文字列の置換を行うコマンドである.一度目のtrは大文字を小文字に,二度目のtrは小文字アルファベット以外を改行へ置き換える.

sortは行の並びをソートする.

uniqは同じ内容の連続する行を1行にまとめる.uniq -c はまとめた行数を先に印字し,空白を挟んで行の内容を印字する.

sort -nr は行の並びを逆順にソートする.このとき,行の内容を数値と見なす.

もちろん,C言語で木構造かトライを作っても良い.おそらく,そうしたほうがより高速に処理できるであろう.しかし,プログラムを書き,デバッグする時間をかけなければならない.そこへ行くと,上述のコマンドをタイプするのは,思いつく時間まで含めて数秒である.(C++やJavaを使えばプログラムを書く時間は若干軽減される.ただし,ハッシュテーブルの使用は勧められない.すぐに単語をアルファベット順に印刷したくなるであろうから.)

一番優れたプログラムは,プログラムを書かないこと,かもしれない.
Comments