 
 
 
 
 
   
 Next: 1.3 awk
Up: 1. UNIX のテキスト・ファイル処理
 Previous: 1.1 標準入出力のリダイレクション、パイプ
 
 
まず以下の準備をしてから、その後の操作をしよう。
(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)。
- grep    パターン    検索したいファイル名
が基本的な使い方。
 ![\begin{itembox}[l]{grep で指定したパターンを含む行の表示}
\footnotesize\begin{ta...
...ttt{ee-list} から \\
& ee080, ee980 を含む行を探す。
\end{tabular}\end{itembox}](img2.png)  
 
- -v とすると、パターンを含まない行を表示する。
 ![\begin{itembox}[l]{grep -v で指定したパターンを含まない行を表示}
\footnotesize\b...
...xttt{ee-list} から \texttt{tcsh} を含まない行を探す。
\end{tabular}\end{itembox}](img3.png)  
 
- -i とすると、大文字・小文字を区別しないで検索する。
 ![\begin{itembox}[l]{grep -i で大文字小文字を区別しない検索}\footnotesize\begin{ta...
...魎泙\\
& ファイルを探す (大・小文字の違いは無視)。
\end{tabular}\end{itembox}](img4.png)  
 
 
- sort
- テキストファイルを行単位で、順序付けて(通常はアルファベット順に)並
べ変える。
- -r     逆順に並べる。
- -n     数値としての大小で並べ変える。
- + ( ( は整数)     第 は整数)     第 フィールドの要素の大小で並べる。 フィールドの要素の大小で並べる。
 例えば、
 ![\begin{itembox}[l]
{ホームディレクトリィにあるファイルを、サイズが大きい順にリス...
...% }\underline{\texttt{ls -l \textasciitilde\ \vert sort +4 -n -r}}
\end{itembox}](img6.png)  
 (ここでは
ls -l ~
の出力の第5フィールドはファイルのサイズである、
と仮定している。)
- wc
- テキスト・ファイル中の行数、単語数、文字数を数える。
 ![\begin{itembox}[l]{wc で行数、単語数、文字数を数える}
\footnotesize\texttt{isc-xas06\% }\underline{\texttt{wc alice29.txt}}
\end{itembox}](img7.png)  
 
- uniq
- 連続する同じ内容の行を1つにまとめる。 
 -c とすると、同じ行が何行続いたか表示する。次の例は、
今回のハイライトとも言える凝った例である。
 ![\begin{itembox}[l]{呪文のように見えるかもしれませんが…}\footnotesize\texttt{isc...
...e{\texttt{cat alice-words \vert sort \vert uniq -c \vert sort -n}}
\end{itembox}](img8.png)  
 
 一体何をやっているのか? 一段一段確認しながらチェックしよう。
 長い
コマンドはシェル・スクリプト5 にすると便利である。
 ![\begin{itembox}[l]{シェルスクリプトの利用}\footnotesize\begin{tabular}{ll}
\text...
...isc-xas06\% }\underline{\texttt{./top20 alice-words}}
\end{tabular}\end{itembox}](img9.png)  
 
- /usr/ucb/tr
- 文字単位の置換、削除を行う。
 /usr/ucb/tr [-cds] [文字列1 [文字列2]]
- -d は削除することを表す。
- -s は同じ字が連続した場合、一字に置換することを表す。
- -c はパターンに含まれない文字を対象にする。
 パターンには文字コードを 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}](img16.png)  
 上記の alice-words というファイルは次のようにして作った
(つまりアルファベット以外の文字の連なりを改行に変換した)。
 ![\begin{itembox}[l]{\texttt{alice-words} はこうして作った}\footnotesize\texttt{is...
... \vert /usr/ucb/tr -cs A-Za-z
'\textbackslash012' > alice-words}}
\end{itembox}](img17.png)  
 
 だから、単語の出現頻度表を得るために、次のようにすることもできる。
 | isc-xas06% 
 
cat alice29.txt | /usr/ucb/tr -cs A-Za-z '\012' | sort |
 uniq -c | sort -n |  
 (こんなに長いコマンドは打つ気になれない?
いざとなったらシェル・スクリプト!)
- head
- 最初の数行のみ表示するコマンド。 
 オプションを指定しないと最初の 10 行を表示する。
- とすると最初の とすると最初の 行を表示する。 行を表示する。| isc-xas06% head -30 /usr/dict/words
    ← /usr/dict/word の先頭から  行を表示する。 |  
 
 (/usr/dict/words は英単語を納めたファイルである。)
- tail
- テキストの最後の方を表示するコマンド。 
 オプションを何も指定しないと 10 行のみ表示する。 - とすると
最後の とすると
最後の 行を表示する。+ 行を表示する。+ とすると、最初の とすると、最初の 行を除いた残
りを表示する。 行を除いた残
りを表示する。| isc-xas06% cat sawyr10.txt | tail -30
    ← sawyr10.txt の最後の 30 行を表示する。 |  
 
- nkf
- 日本語の文字コード(漢字コード)の変換をする。
  
 (nkf については、
前回のプリントに最低限のことは説明したので、ここでは略する。)
 
 
 
 
 
   
 Next: 1.3 awk
Up: 1. UNIX のテキスト・ファイル処理
 Previous: 1.1 標準入出力のリダイレクション、パイプ
Masashi Katsurada 
平成14年5月30日