awk 演習: ASCII 文字かの判定2009年03月31日 00時18分10秒

ファイルの内容が ASCII 内の文字かどうかを判定する必要があり、簡単に作ってみた。

od を用いて、八進数で表示されている文字が無かったら、ファイル名を表示する。入力から入ってきたデータを基に、更にプロセスを生成して、処理する例だ。


{       bin = 0;
        filename = $0
        cmd = "od -c " filename
        count=0
        while(cmd | getline line)
        {
                n = split(line, token)
                if(count++ == 0 && n == 1){ bin = 1; break }
                for(i = 2; i <= n; i++)
                        if(length(token[i]) >= 3) { bin = 1; break }
        }
        close(cmd)
        if(!bin) print filename
}

ファイル名を入力として受け取り、ASCII 文字のみのファイル名を出力に出す。この様に、大量のファイルを開いたりプロセスを生成する場合は、しっかり close() を呼ばないとエラーを起こす。

このプログラム自体は実行速度も遅いし、空のファイルの扱いも出来ておらず、あまり良くできていない。awk で使い捨ての時は、正確性として多少問題はあっても数回動かすデータの範囲内なら問題は無い。ただ、後で引用する時には、そこらへんの注意も必要になる。