2011年3月5日土曜日

gawkで配列の要素数を得る方法

gawk で配列の要素数を得る場合 len=0 ; for (e in a) len++ のように書いていました。
しかし、perl なら @a か $#a+1 、bash なら ${#a[@]} 、Ruby なら a.size または a.length などと書けるし、もしかして gawk でも簡単に記述できるのでは?と思って、man を見たところ、gawk-3.1.5 以降であれば、length(a) と書けることを知りました。
ただ、わたしの場合、仕事上、古いバージョンもサポートする必要があり、使えないのですが、ここにメモしておきます。

まずは、man gawk(1) から抜粋です。
       length([s])             Returns the length of the string s, or the length of  $0
                               if s is not supplied.  Starting with version 3.1.5, as a
                               non-standard extension, with an array argument, length()
                               returns the number of elements in the array.
次に、テストスクリプトです。
#!/bin/gawk -f
#
# test_length_array.gawk
#
# memo:
#   length(array) returns the number of elements with gawk-3.1.5 or later
#   see man gawk(1)
#
function my_len(a,      len) {
        len=0
        for (i in a) len++
        return len
}
function chk_support_length_for_array() {
        return system("gawk 'BEGIN {a[1]=1;length(a);exit(0)}' >/dev/null 2>&1")
}
BEGIN {
        for (i=100; i<777+100; i++) {
                a[i]=i
        }
        if (PROCINFO["version"] == "") {
                f="gawk --version" ; f | getline ; ver=$3 ; close(f)
                printf "INFO: gawk-%s does not supports PROCINFO[\"version\"]\n", ver
        } else {
                ver=PROCINFO["version"]
                printf "INFO: gawk-%s supports PROCINFO[\"version\"]\n", ver
        }
        if (chk_support_length_for_array()) {
                printf "WARNING: gawk-%s does not supports length(array)\n", ver
        }
        printf "my_len(a)=%d\n", my_len(a)
        printf "length(a)=%d\n", length(a)
        exit(0)
}
配列に対する length をサポートするか確認する関数も書いてみました。あと、これも知らなかったのですが、gawk-3.1.4 以降であれば、PROCINFO["version"] という組み込み変数を使えるようです。これを、Fedora 14 で実行してみると、次のようになります。
[root@fedora14 ~]# ./test_length_array.gawk 
INFO: gawk-3.1.8 supports PROCINFO["version"]
my_len(a)=777
length(a)=777
古いシステムだと、次のようにエラーになります。
# ./test_length_array.gawk 
INFO: gawk-3.0.6 does not supports PROCINFO["version"]
WARNING: gawk-3.0.6 does not supports length(array)
my_len(a)=777
gawk: ./test_length_array.gawk:33: fatal: attempt to use array `a' in a scalar context

0 件のコメント:

コメントを投稿

人気ブログランキングへ にほんブログ村 IT技術ブログへ