2011年09月05日

Windows版gawk選び

Windows版gawk 3.1.7日本語版バイナリのダウンロードページが2011年9月現在公開停止中です。仕事にも重宝しており残念です。そこで、ほかにもシフトJISやUTF-8に対応したWindows版gawkを探してみることにしました。

候補として、バージョンが比較的新しい、もしくは、最近まで/今もメンテナンスがされていそうな以下の7種類を選びました。
※Vectorで公開されているNo.5は、3.1.7日本語版と同じ作者さんによる、前のバージョンです。

  1. klabaster gawk 4.0.0
  2. GnuWin gawk 3.1.6-1
  3. DJGPP V2 gawk 3.1.8
  4. DJGPP V2 gawk 4.0.0
  5. Vector gawk 3.1.5
  6. UnxUtils gawk 3.1.0
  7. MinGW gawk 3.1.7

これらgawkについて、マルチバイト文字が含まれる入力テキストに対するパターン走査をさせたときに誤動作が起きるかテストしました。簡単なチェックのため、このテストにパスしても「マルチバイトで誤動作するとはいえない」というだけで、「マルチバイトOK」と結論はできませんが。

テスト1: シフトJISだめ文字マッチ

そのgawkがシフトJISに対応しているかの“ふるい”として、文字コードの2バイト目が0x5C(\, バックスラッシュ)になる文字、いわゆる“だめ文字”を入力データやawkスクリプトに記述して、gawkがパターンマッチを正しく行えるかをテストします。
入力データ(シフトJIS)は
ソ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭
テストするawkスクリプト(シフトJIS)は
/表/ { print }
{ if (match($0, /表/)) print "matched" }
{ sub(/表/, "表表"); print }
期待する出力は、1行目:入力データ行、2行目: matched、3行目: 入力データ行の「表」(0x955C)を「表表」に換えたものです。 結果は、
No.gawkversion結果説明
1klabaster gawk4.0.0正常
2GnuWin gawk3.1.6-1正常
3DJGPP V2 gawk3.1.8エラー/表/でunterminated regexp ※1
4DJGPP V2 gawk4.0.0エラー/表/でunterminated regexp ※1
5Vector gawk3.1.5正常
6UnxUtils gawk3.1.0エラー/表/でunterminated regexp
7MinGW gawk3.1.7エラー/表/でunterminated regexp ※1
※1: パターン、match()およびsub()の引数の正規表現内で発生
※MinGW gawkはMinGW Shellから実行

テスト2: シフトJISだめ文字2バイト目マッチ

次は、入力データ中のシフトJISだめ文字2バイト目がバックスラッシュにマッチしないことをテストします。
入力データ(シフトJIS)は、
表abc
xyz\abc
テストするawkスクリプトは
/\\a/ { print; sub(/\\a/, "123"); print }
期待する出力は、1行目:xyz\abc、2行目:xyz123bc です(「表a」の途中からマッチしないこと)。
結果は、
No.gawkversion結果説明
1klabaster gawk4.0.0正常
2GnuWin gawk3.1.6-1正常
3DJGPP V2 gawk3.1.8誤り「表abc」にマッチ
4DJGPP V2 gawk4.0.0誤り「表abc」にマッチ
5Vector gawk3.1.5正常
6UnxUtils gawk3.1.0誤り「表abc」にマッチ
7MinGW gawk3.1.7誤り「表abc」にマッチ
「表abcにマッチ」はいずれも「・23bc」のように漢字コード2バイト目から置換されました。

テスト3: UTF-8シングルバイトマッチ

UTF-8に対するテストは、あるgawkのバージョンでたまたま見つけた誤動作のパターンを使います。
入力データ(UTF-8 BOMなし)は、
<tag>あいうえお</tag>
あいうえおhello world
あいうえお hello world
テストするawkスクリプトは
{
    print length($0)
    print
    sub(/<tag>/, "")
    sub(/<\/tag>/, "")
    sub(/hello/, "ABC")
    print
}
期待する出力は、1行目:文字数またはバイト数、2行目:入力データ行、3行目は最初の入力データ行については「あいうえお」(tagの中身)、2〜3行目の入力データについては「hello」が「ABC」に置換されたものになります。
結果は下表のとおり。length()欄は、length()関数の戻り値の単位です。
No.gawkversion結果length()説明
1klabaster gawk4.0.0誤り文字数「お」の直後のパターン見逃し ※1
2GnuWin gawk3.1.6-1誤り文字数「お」の直後のパターン見逃し ※1
3DJGPP V2 gawk3.1.8正常バイト数
4DJGPP V2 gawk4.0.0正常バイト数
5Vector gawk3.1.5エラー文字数-W ctype=UTF8を指定。Assertion failedで終了 ※2
6UnxUtils gawk3.1.0正常バイト数
7MinGW gawk3.1.7正常バイト数
※1: 「あいうえお</tag>」「あいうえおhello」
※2: Assertion failed: (tmp->flags & WSTRCUR) != 0, file node.c, line 515

まとめ

No.gawkversionテスト1
SJIS
テスト2
SJIS
テスト3
UTF-8
1klabaster gawk4.0.0正常正常誤り
2GnuWin gawk3.1.6-1正常正常誤り
3DJGPP V2 gawk3.1.8エラー誤り正常
4DJGPP V2 gawk4.0.0エラー誤り正常
5Vector gawk3.1.5正常正常エラー
6UnxUtils gawk3.1.0エラー誤り正常
7MinGW gawk3.1.7エラー誤り正常
3つのテストすべてにパスしたgawkはありませんでしたorz

その他、特記事項として

  • DJGPP版は、コマンドプロンプト画面内で出力が表示されないことがあり、私のPCでは動作が不安定でした。
  • GnuWin gawk 3.1.6-1は、/^[a-zA-Z]+$/ { print }みたいなスクリプトを実行するとデバッグが出力されるという痛いバグが残っていて、実用には向かないと思います。
残念ながら、シフトJIS、UTF-8両方で正常に動作しそうなWindows版gawkは候補の中にありませんでした。シフトJISだけでよければ、gawkの最新版が使えるklabaster版が使えるかもしれません。いずれにせよ、冒頭に挙げた3.1.7日本語版バイナリが一番品質が良いため、大事に使おうと思います。

corbie at 01:23│Comments(5)TrackBack(0)awk | Windows

トラックバックURL

この記事へのコメント

1. Posted by hotaJi   2011年10月03日 15:59
テスト3についてですが、1番の klabaster gawk 4.0.0 は環境変数 LC_ALL=ja_JP.UTF-8 を設定すれば正常に動作するようです。
2. Posted by hotaJi   2011年10月03日 22:34
Windows版gawk 3.1.7日本語版バイナリは現在、http://www.filestube.com/8zDpRNITmuAFPQteVGcQ9p/gawk-mbcs-win32-20091124.html
でダウンロードできるようです。
3. Posted by hotaJi   2011年10月03日 22:53
ん! でも、length() の返り値があってないか?

-------
テスト3についてですが、1番の klabaster gawk 4.0.0 は環境変数 LC_ALL=ja_JP.UTF-8 を設定すれば正常に動作するようです。
4. Posted by corbie   2011年10月05日 23:58
hotaJi様、
情報ありがとうございます。参考にさせていただきます。
5. Posted by aihara   2015年12月08日 03:25
Googleで探しましたところ,
http://bit.ly/1m7bmBH
の中にあるリンク
http://bit.ly/1m7bqBj
からダウンロード可能でした.
当時のページは
https://web.archive.org/web/20100211125708/http://www.kt.rim.or.jp/~kbk/gawk-3.1/
のアーカイブにて.

コメントする

名前
URL
 
  絵文字