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

2.2 フィルター

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

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

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

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

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

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

一体何をやっているのか? 一段一段確認しながらチェックしよう。
長い コマンドはシェル・スクリプト6 にすると便利である。
シェルスクリプトの利用例
isc-xas06% cat top20  
#!/bin/sh  
cat "$@" | sort | uniq -c | sort -r -n | head -20  
isc-xas06% ./top20 alice-words  
/usr/ucb/tr
文字単位の置換、削除を行う。
/usr/ucb/tr [-cds] [文字列1 [文字列2]] パターンには文字コードを 8 進数で指定できる (以下の例を参照) 7 。また文字の範囲を - で指定できる。 A-Z で `A' から `Z' までの文字 (つまり英大文字) を表 す。

以下で /usr/ucb/tr と長く打つのが面倒と思う人は、最初に set path=(/usr/ucb $path) としておくと、 以下は単に tr とすることができる。
BSD UNIX の tr (/usr/ucb/tr)
isc-xas06% set path=(/usr/ucb $path) 単に tr/usr/ucb/tr
呼ぶようにする。
isc-xas06% cat alice29.txt | tr a-z A-Z 小文字を大文字にする。
isc-xas06% cat alice29.txt | tr A-Z a-z 大文字を小文字にする。
isc-xas06% cat DOS-text.txt | tr -d "\015\032" コードが 015, 032 の文字を
削除する。
isc-xas06% cat alice29.txt | tr -cs A-Za-z '\012' アルファベット以外の文字を
改行に変換。
→ 一行一単語に分解する。
上記の alice-words というファイルは次のようにして作った (つまりアルファベット以外の文字の連なりを改行に変換した)。
alice-words はこうして作った
cat alice29.txt | /usr/ucb/tr -cs A-Za-z '\012' > alice-words

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

(こんなに長いコマンドは打つ気になれない? いざとなったらシェル・スクリプト! top20 を参考にして作ってみるとよい (授業で一度だけやってみせる)。)

head
最初の数行のみ表示するコマンド。
オプションを指定しないと最初の 10 行を表示する。 -$x$ とすると最初の $x$ 行を表示する。
isc-xas06% head -30 /usr/dict/words /usr/dict/word の先頭から $30$
  を表示する。

(/usr/dict/words は英単語を納めたファイルである。)
tail
テキストの最後の方を表示するコマンド。
オプションを何も指定しないと 10 行のみ表示する。 -$x$ とすると 最後の $x$ 行を表示する。+$x$ とすると、最初の $x$ 行を除いた残 りを表示する。
isc-xas06% 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日