2013年6月8日土曜日

awk4j の備忘録

awk4j の Web ページには、以下のような説明がある。

「awk4j は、 GNU AWK 互換の言語処理環境で、 AWKスクリプトを、中間言語としてのホスト言語 ( Java, JavaFX, JavaScript, BeanShell, Groovy, Python, Scala ) に変換するトランスレータ方式で動作します。」

仕事をしていると、awk を使いたくなる場合がある。
自宅なら、MinGW とか MSYS とか、Ubuntu マシンとかあるので、困ることは無いのだが、現場によっては、ソフトのインストール自体が難しいことがある。
そんなときに、awk4j が役に立ちそうなので、ちょっと調べてみた。


  • Windows 上で動かすこととする。
  • JDK 1.6 以上がインストールされていること。

awk4j は、Java 1.6 から利用できる jrunscript コマンドを利用して実行する。

まず、awk4j のページから、awk4j-1.6.5-bin.zip をダウンロードし、適当な場所に解凍する。

最初は、実行方法を簡単に説明する。
解凍した以下のディレクトリを、コマンドプロンプトで開く
awk4j-bin\lib

以下のように実行すると、Hello World! と表示される。
AWK スクリプトを内部で Java 言語に変換しているので、CLASSPATH 環境変数の設定が必ず必要となる。
set CLASSPATH=awk4j.jar
%JAVA_HOME%\bin\jrunscript -cp awk4j.jar -l awk4j -e "BEGIN { print \"Hello World!\" }"


バッチ化する場合は、以下のようなコマンドを awk.bat として作成して、バッチと同じディレクトリに awk4j.jar ファイルを格納する。ちなみに、「%~dp0」は、バッチファイルのディレクトリを取得する記述。

@echo off
setlocal
set CLASSPATH=%~dp0awk4j.jar;%CLASSPATH%
%JAVA_HOME%\bin\jrunscript -cp %~dp0awk4j.jar -l awk4j %*
endlocal


同じように、JavaScript に変換して実行することもできる。
JavaScript の場合は、CLASSPATH 環境変数の設定は、いらないようだ。
ただし、Java と JavaScript では、実行時の挙動が異なるようだ!?
JavaScript での実行では、以下のコマンドは、同じ結果になるのだが、入力ファイルを指定しても、処理している様子がないし・・・例文で乗っている "1" とか "NF" のようなスクリプトも、JavaScript では、エラーになってしまうようだ。何か、指定方法などが間違っているのだろうか?

%JAVA_HOME%\bin\jrunscript.exe -cp awk4j.jar -l awk4j.JavaScript -e "BEGIN { print \"Hello World!\" }"


では、作成した awk.bat のコマンド例を示す。

ファイル指定で実行
awk -e "{ print $0 }" hoge.txt

パイプで実行。標準入力からデータを受け取る場合 /dev/stdin をファイル名に指定する。ここら辺の説明は、「言語仕様」リンク先でなされている。
type hoge.txt | awk -e "1" /dev/stdin