Next: 2.3 awk
Up: 2 UNIX のテキスト・ファイル処理
Previous: 2.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 システムでは、標準入出力のリダイレクション、
パイプ機能を活用するため、
標準入力から入力し、標準出力に出力し、他の入出力は使わないで済む
というコマンドが多い。
このようなプログラムをフィルターと呼ぶ。
フィルターは簡単な機能しか持たないものが多いが
複数のフィルターをパイプで接続して複雑な仕事が出来る
ようになっている4。
以下、UNIX の代表的なフィルターをいくつか紹介する。
- grep
- テキスト・ファイルから指定した文字列を検索して、それを含む行を表示す
る。
検索に用いるパターンの指定には、
正規表現 (regular
expression5) と呼ばれる形式が利用できる
(grep の名前の由来は
global/regular-expression/print)。
- grep パターン 検索したいファイル名
が基本的な使い方。
grep で指定したパターンを含む行の表示 |
isc-xas06% grep Alice alice29.txt |
alice29.txt から Alice と |
|
いう語を含む行を探す。 |
isc-xas06% cat alice29.txt | grep Alice |
こうやっても OK. |
isc-xas06% grep 'ee[23]80' ee-list |
数学科学生のパスワード・ |
|
マップ ee-list から ee280, |
|
ee380 を含む行を探す。 |
|
- -v とすると、パターンを含まない行を表示する。
grep -v で指定したパターンを含まない行を表示 |
isc-xas06% grep -v tcsh ee-list |
ee-list から tcsh を含まない行を探す。 |
|
- -i とすると、大文字・小文字を区別しないで検索する。
grep -i で大文字小文字を区別しない検索 |
isc-xas06% grep -i 'MARK TWAIN' * |
カレント・ディレクトリィから |
|
``MARK TWAIN'' を含むファイル |
|
を探す (大・小文字の違いは無視)。 |
|
- sort
- テキストファイルを行単位で、
順序付けて (通常はアルファベット順に) 並べ変える。
- -r 逆順に並べる。
- -n 数値としての大小で並べ変える。
- + ( は整数) 第 フィールドの要素の大小で並べる。
例えば、
ホームディレクトリィにあるファイルを、サイズが大きい順にリストする |
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]]
- -d は削除することを表す。
- -s は同じ字が連続した場合、一字に置換することを表す。
- -c はパターンに含まれない文字を対象にする。
パターンには文字コードを 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 行を表示する。
- とすると最初の 行を表示する。
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: 2.3 awk
Up: 2 UNIX のテキスト・ファイル処理
Previous: 2.1 標準入出力のリダイレクション、パイプ
Masashi Katsurada
平成20年10月18日