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

1.2 フィルター

まず以下の準備をしてから、その後の操作をしよう。(tcsh の設 定がまだの人は、tcsh とタイプして、tcsh を起動し てから実習を始めて下さい。)

waltz11%  cd 						  ホームディレクトリィに移動する。

waltz11% mkdir filter filter という名前のディレクトリィを作る。
waltz11% cd filter filter に移動する。
waltz11% ln -s $ \widetilde{} $re00018/syori2/text2/* .
$\widetilde{} $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 を含む行を探す。
sort
テキストファイルを行単位で、順序付けて(通常はアルファベット順に)並 べ変える。
  • -r     逆順に並べる。
  • -n     数値としての大小で並べ変える。
  • +$x$ ($x$ は整数)     第 $x$ フィールドの要素の大小で並べる。
例えばカレントディレクトリィにあるファイルをサイズが大きい順にリスト するには、

		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 "$\backslash$015$\backslash$032" コードが 015, 032 の文字を削除する。
cat alice29.txt | /usr/ucb/tr -cs A-Za-z '$\backslash$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 "$\backslash$015$\backslash$032" コードが 015, 032 の文字を削除する。
cat alice29.txt | tr -cs '[:alpha:]' '[$\backslash$012*]' アルファベット以外の文字を改行に変換。
→ 一行一単語に分解する。
(上記の alice-wordscat alice29.txt | /usr/ucb/tr -cs A-Za-z '$\backslash$012'>alice-words として作った。つまりアルファベット以外の 文字の連なりを改行に変換した。)
head
最初の数行のみ表示するコマンド。
オプションを指定しないと最初の 10 行を表示する。 -$x$ とすると最初の $x$ 行を表示する。

		 head -30 /usr/dict/words 		 /usr/dict/word の先頭から $30$ 行を表示する。
tail
テキストの最後の方を表示するコマンド。
オプションを何も指定しないと 10 行のみ表示する。 -$x$ とすると 最後の $x$ 行を表示する。+$x$ とすると、最初の $x$ 行を除いた残 りを表示する。

		 cat sawyr10.txt | tail -30 		 sawyr10.txt の最後の 30 行を表示する。
nkf
日本語の文字コード(漢字コード)の変換をする。 次の手順で Windows のテキスト・ファイルを情報科学センターのワークス テーションで利用できるように変換できる (文字コードを日本語 EUC に変換 し、CR, C-z を削除)。

		nkf -ed ファイル名  | tr -d "$\backslash$032" > 新しいファイル名
また、次の手順で、逆にワークステーションで作ったテキスト・ファイルを Windows 用に変換できる (文字コードをシフトJISに変換し、行末に CR を つける)。

		nkf -sc ファイル名 > 新しいファイル名
(ただし、テキスト・ファイルの形式の変換の目的だけならば、 /usr/meiji/pub/bin/ にある qkc とい うコマンドが便利かも知れない。 qkc -euz ファイル名 でワークステーション形式に、 qkc -ms ファイル名 で Winwos 形式になる。 qkc -H でヘルプが見える。qkc には Windows 版もある。)
sed
文字列の置換など、指示に従って編集するコマンド (有名だけど、今回は名 前だけ紹介)。


next up previous
Next: 1.3 awk Up: 1 UNIX のテキスト・ファイル処理 Previous: 1.1 標準入出力のリダイレクション、パイプ
Masashi Katsurada
平成20年10月18日