私的 goawk リポート

benhoyt/goawk: A POSIX-compliant AWK interpreter written in Go

  • Go言語による gawk 互換処理系
  • Windows では Unicode-APIを利用しているため、コンソールに UTF8 を出力しても、化けずに表示される(逆にいうと、CP932 は対応していない)
  • シングルクォートをダブルクォート同様に使えるので、Windowsワンライナーに優しい
    (例:goawk "BEGIN { print 'foo', 42 }"
  • 組み込み用途にも使える(が、個人的にはそういう用途には GopherLua を使うので、詳しくは調べるつもりはない)
  • 文字列の扱いはGo 言語に準じる。つまり
    • 文字列のインデックスはバイト単位
    • しかし、正規表現. などはちゃんとUTF8の1文字に対応している
$ echo あいうえお | goawk "{ s=$0 ; while(match(s,/./) > 0){ print substr(s,RSTART,RLENGTH) ; s=substr(s,RSTART+RLENGTH)} }"
あ
い
う
え
お

なお、Windows版では自前のワイルドカード展開がなかった(~1.7.0)ため、不便だった。 だが、ワイルドカード展開を行うプルリク送ってみたところ、採用はされなかったものの、対応してくれた。ありがたや! まだリリースバイナリには反映されていないみたいなので、使いたい人は自分でビルドしよう!(go build だけでよい)

Before:

$ goawk "FNR==1 { print FILENAME }" *.go
open *.go: The filename, directory name, or volume label syntax is incorrect.

After:

$ goawk "FNR==1 { print FILENAME }" *.go
goawk.go
goawk_test.go
goawk_windows.go

スクリプト言語の元祖である awk が UTF8 で使えるのは嬉しい。引用符拡張のおかげでバッチファイルからも使いやすくなっていて、ツールとして便利よく使えそうだ。