next up previous
Next: 2.3 awk Up: 2 UNIX のテキスト・ファイル処理 Previous: 2.1 標準入出力のリダイレクション、パイプ

2.2 フィルター

まず以下の準備をしてから、その後の操作をしよう。 (tcsh の設定がまだの人は、tcsh とタイプして、 tcsh を起動してから実習を始めて下さい。)
実験用ファイルの準備
a308-06% cd ← ホームディレクトリィに移動する。
a308-06% tcsh ← tcsh を実行 (設定済みの人は不要)。
a308-06% mkdir filter filter というディレクトリィを作る。
a308-06% cd filter filter に移動する。
a308-06% ln -s ~re00018/gutenberg/* . ~re00018/gutenberg にあるファイル
      にシンボリック・リンクを張る。
a308-06% ls ← どういうファイルがあるか、確認する。
  alice29.txt などが見えるはず。
a308-06% cat LIST LIST の中身を見る。

今回配布したファイル (以下では Gutenberg テキストと呼ぶことにする) の出所については、 付録 A 「古典 (文書) の電子化」を参照せよ。

UNIX システムでは、標準入出力のリダイレクション、 パイプ機能を活用するため、

標準入力から入力し、標準出力に出力し、他の入出力は使わないで済む
というコマンドが多い。 このようなプログラムをフィルターと呼ぶ。 フィルターは簡単な機能しか持たないものが多いが
複数のフィルターをパイプで接続して複雑な仕事が出来る
ようになっている5

以下、UNIX の代表的なフィルターをいくつか紹介する。

grep
テキスト・ファイルから指定した文字列を検索して、それを含む行を表示す る。
 検索に用いるパターンの指定には、 正規表現 (regular expression6) と呼ばれる形式が利用できる (grep の名前の由来は global/regular-expression/print)。
sort
テキストファイルを行単位で、 順序付けて (通常はアルファベット順に) 並べ変える。 例えば、
ホームディレクトリィにあるファイルを、サイズが大きい順にリストする
a308-06% ls -l ~ | sort +4 -n -r
(ここでは ls -l ~ の出力の第5フィールドはファイルのサイズである、 と仮定している。)
wc
テキスト・ファイル中の行数、単語数、文字数を数える。
wc で行数、単語数、文字数を数える
a308-06% wc alice29.txt
uniq
連続する同じ内容の行を1つにまとめる。
-c とすると、同じ行が何行続いたか表示する。次の例は、 今回のハイライトとも言える凝った例である。
呪文のように見えるかもしれませんが…
a308-06% cat alice-words | sort | uniq -c | sort -n

一体何をやっているのか? 一段一段確認しながらチェックしよう。
長い コマンドはシェル・スクリプト7 にすると便利である。
シェルスクリプトの利用例
a308-06% cat top20  
#!/bin/sh  
cat "$@" | sort | uniq -c | sort -r -n | head -20  
a308-06% ./top20 alice-words  
tr
文字単位の置換、削除を行う。
tr [-cds] [文字列1 [文字列2]] パターンには文字コードを 8 進数で指定できる (以下の例を参照) 8 。また文字の範囲を - で指定できる。 A-Z で `A' から `Z' までの文字 (つまり英大文字) を表す。
BSD UNIX の tr (tr)
a308-06% cat alice29.txt | tr a-z A-Z 小文字を大文字にする。
a308-06% cat alice29.txt | tr A-Z a-z 大文字を小文字にする。
a308-06% cat DOS-text.txt | tr -d "\015\032" コードが 015, 032 の文字を
削除する。
a308-06% cat alice29.txt | tr -cs A-Za-z '\012' アルファベット以外の文字を
改行に変換。
→ 一行一単語に分解する。
上記の alice-words というファイルは次のようにして作った (つまりアルファベット以外の文字の連なりを改行に変換した)。
alice-words はこうして作った
cat alice29.txt | tr -cs A-Za-z '\012' > alice-words

だから、単語の出現頻度表を得るために、次のようにすることもできる。
直接 alice29.txt から単語の出現頻度表を作る。
cat alice29.txt | tr -cs A-Za-z '\012' | sort | uniq -c | sort -n

(こんなに長いコマンドは打つ気になれない? いざとなったらシェル・スクリプト! top20 を参考にして作ってみるとよい (授業で一度だけやってみせる)。)
head
最初の数行のみ表示するコマンド。
オプションを指定しないと最初の 10 行を表示する。 -$x$ とすると最初の $x$ 行を表示する。
a308-06% head -30 /usr/share/dict/words /usr/share/dict/word
  先頭から $30$ 行を表示する。

(/usr/share/dict/words は英単語を納めたファイルである。 Solaris では /usr/dict/words というパス名になっている。)
tail
テキストの最後の方を表示するコマンド。
オプションを何も指定しないと 10 行のみ表示する。 -$x$ とすると 最後の $x$ 行を表示する。+$x$ とすると、最初の $x$ 行を除いた残 りを表示する。
a308-06% cat sawyr10.txt | tail -30 sawyr10.txt の最後の 30 行を
  表示する。
nkf
日本語の文字コード(漢字コード)の変換をする。
(nkf については、 前回のプリントに最低限のことは説明したので、ここでは略する。)


next up previous
Next: 2.3 awk Up: 2 UNIX のテキスト・ファイル処理 Previous: 2.1 標準入出力のリダイレクション、パイプ
Masashi Katsurada
平成20年10月18日