LoginSignup
10
9

More than 5 years have passed since last update.

日本語とかの全角を半角に変換するawk

Posted at
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

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9