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

1.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 システムでは、標準入出力のリダイレクション、 パイプ機能を活用するため、

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

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

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

一体何をやっているのか? 一段一段確認しながらチェックしよう。
長い コマンドはシェル・スクリプト5 にすると便利である。
\begin{itembox}[l]{シェルスクリプトの利用}\footnotesize\begin{tabular}{ll}
\text...
...isc-xas06\% }\underline{\texttt{./top20 alice-words}}
\end{tabular}\end{itembox}
/usr/ucb/tr
文字単位の置換、削除を行う。
/usr/ucb/tr [-cds] [文字列1 [文字列2]] パターンには文字コードを 8 進数で指定できる (以下の例を参照) 6 。また文字の範囲を - で指定できる。 A-Z で `A' から `Z' までの文字 (つまり英大文字) を表 す。

以下で /usr/ucb/tr と長く打つのが面倒と思う人は、最初に set path=(/usr/ucb $path) としておくと、 以下は単に tr とすることができる。
\begin{itembox}[l]{BSD UNIX の tr (\texttt{/usr/ucb/tr})}\footnotesize\begin{tab...
...\\
& 改行に変換。\\
& → 一行一単語に分解する。
\end{tabular}\end{itembox}
上記の alice-words というファイルは次のようにして作った (つまりアルファベット以外の文字の連なりを改行に変換した)。
\begin{itembox}[l]{\texttt{alice-words} はこうして作った}\footnotesize\texttt{is...
... \vert /usr/ucb/tr -cs A-Za-z
'\textbackslash012' > alice-words}}
\end{itembox}

だから、単語の出現頻度表を得るために、次のようにすることもできる。
isc-xas06% cat alice29.txt | /usr/ucb/tr -cs A-Za-z '\012' | sort | uniq -c | sort -n
(こんなに長いコマンドは打つ気になれない? いざとなったらシェル・スクリプト!)

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: 1.3 awk Up: 1. UNIX のテキスト・ファイル処理 Previous: 1.1 標準入出力のリダイレクション、パイプ
Masashi Katsurada
平成14年5月30日