渡辺一寛です。

At Wed, 8 May 2013 17:26:15 +0900,
Kouichi Hirabayashi wrote:
> > awk(1) との事なので、こちらは one true awk の方だと思います。
> > lang/gawk が GNU awk で /usr/local/bin/gawk になります。
> 
> gawk でも漢字を含む文字列で index() が正しい結果になりません。

うちの環境 (9.1-RELEASE, LC_CTYPE=ja_JP.eucJP) だとこうなります。

* japanese/gawk

$ /usr/local/bin/gawk --version | head -n 1
GNU Awk 3.0.6 + multi-byte extension 1.15
$ /usr/local/bin/gawk 'BEGIN{print index("日本語", "本")}'
3
$ /usr/local/bin/gawk 'BEGIN{print jindex("日本語", "本")}'
3
$ /usr/local/bin/gawk --ctype=EUC 'BEGIN{print index("日本語", "本")}'
3
$ /usr/local/bin/gawk --ctype=EUC 'BEGIN{print jindex("日本語", "本")}'
2
$ 

ctype を指定した上で "j" の付いた関数を使用すると、文字単位でカウントします。

* システム標準の awk (one true awk == nawk)

$ /usr/bin/awk --version
awk version 20110810 (FreeBSD)
$ /usr/bin/awk 'BEGIN{print index("日本語", "本")}'
3
$ 

バイト単位で見ているようです。

* lang/gawk

$ cd /usr/ports/lang/gawk/work/gawk-4.0.2/
$ ./gawk --version | head -n 1
GNU Awk 4.0.2
$ ./gawk 'BEGIN{print index("日本語", "本")}'
2
$ (unset LC_CTYPE; ./gawk 'BEGIN{print index("日本語", "本")}')
3
$ 

マルチバイト対応をするかどうかは locale で見ているようです。
# make install すると ja-gawk を上書きしてしまうので、make だけして
# コンパイルディレクトリでテストしてます)
---
WATANABE Kazuhiro (cqg00...@nifty.ne.jp)

メールによる返信