01: プログラミング言語とは何か 02: 0から99まで印字するプログラムの解説 03: Pythonで書くと... 04: 変数と関数 05: 条件分岐とループ 06: プリプロセス 07: ポインタと配列1 08: ポインタと配列2 09: ポインタと配列3 0A: 文字列 0B: 多次元配列 0C: ファイル入出力 0D: 構造体 0E: コマンドライン引数 0F: 数値を読み込んで総和と平均を表示するプログラム 10: 数値を読み込んで総和と平均を表示するPythonプログラム 11:【番外編】文章中の単語を出現頻度順に表示するプログラム 12:【番外編】コマンドライン引数を処理するイディオム 13:【番外編】C言語でクロージャを実装する
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を使えばプログラムを書く時間は若干軽減される.ただし,ハッシュテーブルの使用は勧められない.すぐに単語をアルファベット順に印刷したくなるであろうから.)
一番優れたプログラムは,プログラムを書かないこと,かもしれない.