zen2han.awk
# zen2han.awk
# 全角 英数字記号 を半角文字に変換する
# 全角カタカナ等も対象とする。
BEGIN{
split("0123456789", az, "");
split("0123456789", ah, "");
split("ABCDEFGHIJKLMNOPQRSTUVWXYZ", bz, "");
split("ABCDEFGHIJKLMNOPQRSTUVWXYZ", bh, "");
split("abcdefghijklmnopqrstuvwxyz", cz, "");
split("abcdefghijklmnopqrstuvwxyz", ch, "");
split(" ~’”:;[]+-*/=!@#$%^&*()_|.,<>?¥", dz, "");
split(" ~'\":;[]+-*/=!@#$%^&*()_|.,<>?\\", dh, ""); # \ は重ねて記述、
split("。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゛゜", kz, "");
split("。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚", kh, "");
split("ウカキクケコサシスセソタチツテトハヒフヘホ", kzb, "");
split("ヴガギグゲゴザジズゼゾダヂヅデドバビブベボ", kzd, "");
split("ハヒフヘホ", kzc, "");
split("パピプペポ", kze, "");
#for( e in dh){
# if(dh[e]=="(") dh[e] = "\\(";
# if(dh[e]==")") dh[e] = "\\)";
# if(dh[e]==".") dh[e] = "\\.";
# if(dh[e]=="|") dh[e] = "\\|";
# if(dh[e]=="^") dh[e] = "\\^";
# if(dh[e]=="$") dh[e] = "\\$";
# if(dh[e]=="[") dh[e] = "\\[";
# if(dh[e]=="]") dh[e] = "\\]";
#}
}
{ # メインルーチン #
for(e in az) gsub(az[e],ah[e]); # 全角数字を半角に変換
for(e in bz) gsub(bz[e],bh[e]); # 全角英字を半角に変換(大文字)
for(e in cz) gsub(cz[e],ch[e]); # 全角英字を半角に変換(小文字)
for(e in dz) gsub(dz[e],dh[e]); # 全角記号を半角記号へ変換
for(e in kz) gsub(kz[e],kh[e]); # 全角カナを半角カナへ変換
for(e in kzd) gsub(kzd[e],kzb[e] "゙"); # 半角カナ + ゛を濁点付の半角カナへ変換
for(e in kze) gsub(kze[e],kzc[e] "゚"); # 半角カナ + ゜を半濁点付の半角カナへ変換
print;
}
# gsub(reg, s [, t]) において、
# 置換テキスト s では、 & は実際にマッチしたテキストで置き換えられる。
# \& を使用するとリテラルの & を得ることができます。
# さらに、"" 内では、"\\" → '\'となるので、 \\ を重ねて記載する必要がある。
#
# 例: gsub(/&/,"\\&");
#
# sub() や gensub()でも同様。
下記を参考にした。
http://www.geocities.jp/cygnus_odile/tategaki/script-sjis/han2zen.awk.txt