3 桁ごとにカンマで区切る

programming_language_awk.jpg

3桁ごとにカンマで区切る - みずぴー日記にインスパイヤされて、awk を使って 3 桁ごとにカンマで区切ります。 「プログラミング言語 AWK」を読まれた方であれば、addcomma() という関数で紹介されていますし、同じものの紹介で、再帰的にカンマで区切る関数を呼び出していくというものです。

#! /usr/local/bin/nawk -f
# sep_by_comma.awk
# 3 桁ごとにカンマで区切る
# usage: nawk -f sep_by_comma.awk num

BEGIN {
    num = ARGV[1] ? ARGV[1] : 123456789;

    print sep_by_comma(num);
}

# sep_by_comma():   3 桁ごとにカンマで区切る
#   in:     整数 (x)
#   out:    3 桁ごとにカンマで区切られた数
#   Ref:    「プログラミング言語AWK」
#           http://www.amazon.co.jp/exec/obidos/ASIN/4775302493
function sep_by_comma(x,    num) {
    if (x < 0) {
        return "-" sep_by_comma(-x);
    }

    num = sprintf("%.2f", x);
    while (num ~ /[0-9][0-9][0-9][0-9]/) {
        sub(/[0-9][0-9][0-9][,.]/, ",&", num);
    }
    return num;
}

実行してみましょう。

$ gawk -f sep_by_comma.awk
123,456,789.00

とこのようにカンマで区切られるわけですが、正規表現の部分が繰り返しになっているので、少し何とかしてみましょう。 具体的には以下のようにしますが、gawk などに限定されます。

#! /usr/local/bin/gawk -f
# sep_by_commai_2.awk
# 3 桁ごとにカンマで区切る
# usage: gawk -f sep_by_comma.awk num

BEGIN {
    num = ARGV[1] ? ARGV[1] : 123456789;

    print sep_by_comma(num);
}

# sep_by_comma():   3 桁ごとにカンマで区切る
#   in:     整数 (x)
#   out:    3 桁ごとにカンマで区切られた数
#   Ref:    「プログラミング言語AWK」
#           http://www.amazon.co.jp/exec/obidos/ASIN/4775302493
function sep_by_comma(x,    num) {
    if (x < 0) {
        return "-" sep_by_comma(-x);
    }

    num = sprintf("%.2f", x);
    while (num ~ /[0-9]{4}/) {             # <- ここの正規表現
        sub(/[0-9]{3}[,.]/, ",&", num);    # <- ここの正規表現
    }
    return num;
}

実行してみますが、gawk の場合には re-interval オプションを付けます。

$ gawk --re-interval -f sep_by_comma_2.awk
123,456,789.00

また、Busybox の awk の場合には、そのまま実行できます。

$ busybox awk -f sep_by_comma_2.awk
123,456,789.00

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png