2011年09月05日
Windows版gawk選び
Windows版gawk 3.1.7日本語版バイナリのダウンロードページが2011年9月現在公開停止中です。仕事にも重宝しており残念です。そこで、ほかにもシフトJISやUTF-8に対応したWindows版gawkを探してみることにしました。
入力データ(シフトJIS)は
※1: パターン、match()およびsub()の引数の正規表現内で発生
※MinGW gawkはMinGW Shellから実行
入力データ(シフトJIS)は、
結果は、
「表abcにマッチ」はいずれも「・23bc」のように漢字コード2バイト目から置換されました。
入力データ(UTF-8 BOMなし)は、
結果は下表のとおり。length()欄は、length()関数の戻り値の単位です。
※1: 「あいうえお</tag>」「あいうえおhello」
※2: Assertion failed: (tmp->flags & WSTRCUR) != 0, file node.c, line 515
3つのテストすべてにパスしたgawkはありませんでしたorz
候補として、バージョンが比較的新しい、もしくは、最近まで/今もメンテナンスがされていそうな以下の7種類を選びました。
※Vectorで公開されているNo.5は、3.1.7日本語版と同じ作者さんによる、前のバージョンです。
- klabaster gawk 4.0.0
- GnuWin gawk 3.1.6-1
- DJGPP V2 gawk 3.1.8
- DJGPP V2 gawk 4.0.0
- Vector gawk 3.1.5
- UnxUtils gawk 3.1.0
- 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. | gawk | version | 結果 | 説明 |
---|---|---|---|---|
1 | klabaster gawk | 4.0.0 | 正常 | |
2 | GnuWin gawk | 3.1.6-1 | 正常 | |
3 | DJGPP V2 gawk | 3.1.8 | エラー | /表/でunterminated regexp ※1 |
4 | DJGPP V2 gawk | 4.0.0 | エラー | /表/でunterminated regexp ※1 |
5 | Vector gawk | 3.1.5 | 正常 | |
6 | UnxUtils gawk | 3.1.0 | エラー | /表/でunterminated regexp |
7 | MinGW gawk | 3.1.7 | エラー | /表/でunterminated regexp ※1 |
※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. | gawk | version | 結果 | 説明 |
---|---|---|---|---|
1 | klabaster gawk | 4.0.0 | 正常 | |
2 | GnuWin gawk | 3.1.6-1 | 正常 | |
3 | DJGPP V2 gawk | 3.1.8 | 誤り | 「表abc」にマッチ |
4 | DJGPP V2 gawk | 4.0.0 | 誤り | 「表abc」にマッチ |
5 | Vector gawk | 3.1.5 | 正常 | |
6 | UnxUtils gawk | 3.1.0 | 誤り | 「表abc」にマッチ |
7 | MinGW gawk | 3.1.7 | 誤り | 「表abc」にマッチ |
テスト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. | gawk | version | 結果 | length() | 説明 |
---|---|---|---|---|---|
1 | klabaster gawk | 4.0.0 | 誤り | 文字数 | 「お」の直後のパターン見逃し ※1 |
2 | GnuWin gawk | 3.1.6-1 | 誤り | 文字数 | 「お」の直後のパターン見逃し ※1 |
3 | DJGPP V2 gawk | 3.1.8 | 正常 | バイト数 | |
4 | DJGPP V2 gawk | 4.0.0 | 正常 | バイト数 | |
5 | Vector gawk | 3.1.5 | エラー | 文字数 | -W ctype=UTF8を指定。Assertion failedで終了 ※2 |
6 | UnxUtils gawk | 3.1.0 | 正常 | バイト数 | |
7 | MinGW gawk | 3.1.7 | 正常 | バイト数 |
※2: Assertion failed: (tmp->flags & WSTRCUR) != 0, file node.c, line 515
まとめ
No. | gawk | version | テスト1 SJIS | テスト2 SJIS | テスト3 UTF-8 |
---|---|---|---|---|---|
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 | エラー | 誤り | 正常 |
その他、特記事項として
- DJGPP版は、コマンドプロンプト画面内で出力が表示されないことがあり、私のPCでは動作が不安定でした。
- GnuWin gawk 3.1.6-1は、/^[a-zA-Z]+$/ { print }みたいなスクリプトを実行するとデバッグが出力されるという痛いバグが残っていて、実用には向かないと思います。
トラックバック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 を設定すれば正常に動作するようです。
-------
テスト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/
のアーカイブにて.
http://bit.ly/1m7bmBH
の中にあるリンク
http://bit.ly/1m7bqBj
からダウンロード可能でした.
当時のページは
https://web.archive.org/web/20100211125708/http://www.kt.rim.or.jp/~kbk/gawk-3.1/
のアーカイブにて.