Next: 1.3 awk
Up: 1 UNIX のテキスト・ファイル処理
Previous: 1.1 標準入出力のリダイレクション、パイプ
まず以下の準備をしてから、その後の操作をしよう。(tcsh の設
定がまだの人は、tcsh とタイプして、tcsh を起動し
てから実習を始めて下さい。)
waltz11% cd ホームディレクトリィに移動する。
waltz11% mkdir filter filter という名前のディレクトリィを作る。
waltz11% cd filter filter に移動する。
waltz11% ln -s re00018/syori2/text2/* .
re00018/syori2/text2 にあるファイルにシンボリック・
リンクを張る。
waltz11% ls どういうファイルがあるか、確認する。
alice29.txt などのファイル名が見えるはず。
waltz11% cat LIST
|
UNIX システムでは、標準入出力のリダイレクション、パイプ機能を活用する
ため、
標準入力から入力し、標準出力に出力し、他の入出力は使わないで済む
というコマンドが多い。このようなプログラムをフィルターと呼ぶ。
フィルターは簡単な機能しか持たないものが多いが (その代わり高速に実行でき
るようチューニングされている)、
複数のフィルターをパイプで接続して複雑な仕事が出来る
ようになっている。
- grep
- テキスト・ファイルから指定した文字列を検索して、それを含む行を表示す
る。
検索に用いるパターンの指定には、正規表現 (regular
expression2) と呼ばれる形式が利用できる (grep の名前の
由来は
global/regular-expression/print)。
grep Alice alice29.txt alice29.txt から Alice という語を含む
行を探す。
grep 'ee[78]80' ee-list 数学科学生のパスワード・マップ ee-list から
ee780, ee880 を含む行を探す。
|
- -v とすると、パターンを含まない行を表示する。
grep -v tcsh ee-list ee-list から tcsh を含まない行を探す。
|
- -i とすると、大文字・小文字を区別しないで検索する。
grep -i 'MARK TWAIN' * カレント・ディレクトリィから
``MARK TWAIN'' を含むファイル
を探す (大・小文字の違いは無視)。
|
- sort
- テキストファイルを行単位で、順序付けて(通常はアルファベット順に)並
べ変える。
- -r 逆順に並べる。
- -n 数値としての大小で並べ変える。
- + ( は整数) 第 フィールドの要素の大小で並べる。
例えばカレントディレクトリィにあるファイルをサイズが大きい順にリスト
するには、
ls -l | sort +4 -n -r
(ここでは、ls -l の出力の第5フィールドにはファイルのサイズがある
と仮定している。)
- wc
- テキスト・ファイル中の単語数、行数、文字数を数える。
wc alice29.txt
- uniq
- 連続する同じ内容の行を1つにまとめる。
-c とすると、同じ行が何行続いたか表示する。次の例は、
今回のハイライトとも言える凝った例である。
cat alice-words | sort | uniq -c | sort -n
一体何をやっているのか? 一段一段確認しながらチェックしよう。
長い
コマンドはシェル・スクリプト3 にすると便利である。
cat top20
top20 alice-words
- tr
- 文字単位の置換、削除を行う。
tr [-cds] [文字列1 [文字列2]]
- -d は削除することを表す。
- -s は同じ字が連続した場合、一字に置換することを表す。
- -c はパターンに含まれない文字を対象にする。
パターンには文字コードを 8 進数で指定できる (以下の例を参照)
4 。また文字の範囲を - で指定できる。
A-Z で `A' から `Z' までの文字 (つまり英大文字) を表
す。
[ |
l]BSD UNIX の tr (/usr/ucb/tr)
cat alice29.txt | /usr/ucb/tr a-z A-Z 小文字を大文字にする。
cat alice29.txt | /usr/ucb/tr A-Z a-z 大文字を小文字にする。
cat DOS-text.doc | /usr/ucb/tr -d "015032" コードが 015, 032 の文字を削除する。
cat alice29.txt | /usr/ucb/tr -cs A-Za-z '012' アルファベット以外の文字を改行に変換。
→ 一行一単語に分解する。
|
[ |
l]System V の tr
cat alice29.txt | tr '[a-z]' '[A-Z]' 小文字を大文字にする。
cat alice29.txt | tr '[A-Z]' '[a-z]' 大文字を小文字にする。
cat DOS-text.doc | tr -d "015032" コードが 015, 032 の文字を削除する。
cat alice29.txt | tr -cs '[:alpha:]' '[012*]' アルファベット以外の文字を改行に変換。
→ 一行一単語に分解する。
|
(上記の alice-words は
cat alice29.txt | /usr/ucb/tr -cs A-Za-z '012'>alice-words
として作った。つまりアルファベット以外の
文字の連なりを改行に変換した。)
- head
- 最初の数行のみ表示するコマンド。
オプションを指定しないと最初の 10 行を表示する。
- とすると最初の 行を表示する。
head -30 /usr/dict/words /usr/dict/word の先頭から 行を表示する。
- tail
- テキストの最後の方を表示するコマンド。
オプションを何も指定しないと 10 行のみ表示する。 - とすると
最後の 行を表示する。+ とすると、最初の 行を除いた残
りを表示する。
cat sawyr10.txt | tail -30 sawyr10.txt の最後の 30 行を表示する。
- nkf
- 日本語の文字コード(漢字コード)の変換をする。
- -e 日本語 EUC に変換する。
- -s シフト・ジスに変換する。
- -j JIS 漢字コードに変換する。
- -v 使い方の簡単な説明を表示する。
次の手順で Windows のテキスト・ファイルを情報科学センターのワークス
テーションで利用できるように変換できる (文字コードを日本語 EUC に変換
し、CR, C-z を削除)。
nkf -ed ファイル名 | tr -d "032" > 新しいファイル名
また、次の手順で、逆にワークステーションで作ったテキスト・ファイルを
Windows 用に変換できる (文字コードをシフトJISに変換し、行末に CR を
つける)。
nkf -sc ファイル名 > 新しいファイル名
(ただし、テキスト・ファイルの形式の変換の目的だけならば、
/usr/meiji/pub/bin/ にある qkc とい
うコマンドが便利かも知れない。
qkc -euz ファイル名 でワークステーション形式に、
qkc -ms ファイル名 で Winwos 形式になる。
qkc -H でヘルプが見える。qkc には Windows 版もある。)
- sed
- 文字列の置換など、指示に従って編集するコマンド (有名だけど、今回は名
前だけ紹介)。
Next: 1.3 awk
Up: 1 UNIX のテキスト・ファイル処理
Previous: 1.1 標準入出力のリダイレクション、パイプ
Masashi Katsurada
平成20年10月18日