読みこんだ行の内容を空白で区切ったもの(単語らしきもの)について,若干の事前処理が必要なわけである。

 以下のスクリプトでは,それを行う関数 shapeup を定義している。関数に単語らしきものを渡すと,アルファベット以外の文字を取り除き,大文字は小文字にしたものが返ってくる。それを添字としてカウントすればよいわけである。


#!/usr/local/bin/gawk -f
{
	for (i = 1; i <= NF; i++) {
		$i = shapeup($i)
		word[$i]++
	}
}

END {
	for (i in word) {
		print i, word[i]
	}
}

function shapeup(string,     retv, i, c)
{
	retv = "" # 処理された単語。最初は空文字列にしておく
	for (i = 1; i <= length(string); i++) { # length() 関数は文字列の長さを返す
		c = substr(string, i, 1) # 文字列 string の,i 文字目から,1 文字取り出し,c に格納する
		if (("A" <= c && c <= "Z") || ("a" <= c && c <= "z")) { # 文字がアルファベットであるときに真
			if ("A" <= c && c <= "Z") { # 大文字であるときに真
				c = substr("abcdefghijklmnopqrstuvwxyz", index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", c), 1)
				# index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", c) は,
				# c が,文字列 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" の中の何番目であるかを返す
				# 例えば,c = "E" の場合,5という値を返す。そのとき,
				# substr("abcdefghijklmnopqrstuvwxyz", index("ABCDEFGHIJKLMNOPQRSTUVWXYZ", c), 1)
				# は,substr("abcdefghijklmnopqrstuvwxyz", 5, 1) ということになり,
				# 文字 "e" が返される
			}
			retv = retv c # 文字を連結する
		}
		else { # 文字がアルファベットでないとき
			continue # 次の文字を処理する
		}
	}
	return retv # 処理された単語を返す
}

実行してみる


注:上の shapeup 関数は,冗長である。実際は次のように簡単にできる。
#!/usr/local/bin/gawk -f
{
	$0 = tolower($0)    # すべての大文字を小文字に変換してしまう
	gsub(/[^a-z_ \t]/, "", $0)  # 英字,アンダーバー,空白,タブ以外を消去する
	for (i = 1; i <= NF; i++) {
		word[$i]++
	}
}

END {
	for (i in word) {
		print i, word[i]
	}
}

 非常にコンパクトになった。

実行してみる


●前へ戻る   ●次へ進む
Last modified: May 15, 2002

E-mail to Shigenobu AOKI