以下のスクリプトでは,それを行う関数 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 # 処理された単語を返す }
#!/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] } }
● 実行してみる