Windows で GAWK を使用する準備
Windows10 32bit の前提(筆者の環境)で説明します。
GAWKの入手
最新のWindows用のGAWKはこちらで入手できます。
使用する場合はバイナリをダウンロードします。ダウンロードしたzipファイルを解凍し、フォルダ名をgawkXXXに変更し、ここではドライブCの直下に移動します。
ここでは便宜上執筆時の最新版であるGAWK5.0.1よりフォルダ名を「gawk501」とします。
GAWK各種設定
gawk.exe のプログラムパス
GAWKをダウンロード解凍し、Cの直下に置いただけは Windows は GAWK(gawk.exe)というプログラムがどこにあるのかわかりません。「bin」というフォルダ(ディレクトリ)にありますので、以下のようにプログラムパスを通します。
コントロールパネル → システム → システムの詳細設定 → 環境変数(ボタン)
ユーザーの環境変数内 Pathを選択 → 編集 → 新規
C:\gawk501\bin
と入力し、「OK」ボタンでそれぞれのウィンドウを閉じます。
コマンドプロンプトにて gawk --version
とタイプして起動を確認します。
AWKPATH
環境変数 AWKPATH は AWKスクリプトのソースファイルの格納場所(ディレクトリ)を示す変数です。これがなければコマンド上で、ソースファイル名を絶対/相対パスで書かなければならなくなります。
カレントディレクトリ(bar.txtがあるディレクトリ)にて
gawk -f D:\AWK_FILES\foo.awk bar.txt
gawk -f foo.awk bar.txt
gawk は -f
オプションでスクリプトファイルを使用します。上段のように、フルパスで書くのはとても億劫なので、ファイル foo.awk の在処を AWKPATH に登録するという感じです。そうすると、下段のように書けます。
AWKPATH の登録
AWKスクリプトの専用フォルダを準備(新規作成)します。仮に上述の通り、D:\AWK_FILES としましょう。前述のプログラムパスと同様に環境変数のダイアログを立ち上げます。少し違うのが、今度はシステム環境変数に登録します。何故とは聞かないでください。
新規ボタン 変数名「AWKPATH」 変数値「.\;D:\AWK_FILES」です。
先頭の「.\」がカレントディレクトリを表し、次の「;」は区切り文字です。
カレントディレクトリは必ず登録してください。バッチファイルとスクリプトファイルを同じフォルダに入れて起動させることが頻繁に起きます。バッチファイル内で、そのフォルダをカレントディレクトリに変更するのは常套手段ですので。
「OK」をクリックして、登録後、D:\AWK_FILES\ に簡単なスクリプトをエディタで書いて保存し、コマンドプロンプトにて確認してください。
hello.awk
BEGIN {
print "hello,world!";
}
gawk -f hello.awk
※コマンドプロンプトでは、print文にて、行頭に日本語が来るとエラーになります。
AWKLIBPATH
環境変数 AWKLIBPATH は、GAWK 本体の持つ組み込み関数では処理不可能なことを実現する「extension(.dllファイル)」の格納場所を示す変数です。大変重宝しますし、自分で作成することもできるので、登録しておきましょう。
AWKLIBPATH の登録
前述の AWKPATH と手順は同じです。
「OK」をクリックして、登録後、以下のスクリプトを前述「D:\AWK_FILES」に保存して、コマンドプロンプトにて実行します。
test_ext.awk
@load "time";
BEGIN {
time = gettimeofday();
for (i = 1; i < 1000000; i++) ;
time = gettimeofday() - time;
printf("Elapsed Time = %d(msec)\n", time * 1000);
}
gawk -f test_ext.awk
GAWK 単体ではできないミリ秒単位の計測を可能にする「time.dll」です。
「time.dll」をロードすると、gettimeofday() という関数が使えるようになります。
GAWK の設定はこれで終わりです。
Windows で GAWK を使用する方法はもちろん上記に限ったものではありません。Windows 用の gawk.exe(オールインワンタイプ) もいくつかありますし、64bit環境であれば、Bash on Windows という選択肢もあります。
筆者のお気に入りは、「MSYS2」という Unix ライクなコンソールをコマンドプロンプトの替わりに使うという方法です。コマンドプロンプトをシェルとして見た場合、Bash+Unix/linux 系コマンドと比較すると、あまりにも貧弱であることを実感します。