AWK を 気軽に使いませう

[目次へ戻る]

17.gawk を Windows 2000/XP で、便利に使う


Gnu AWK 自身の機能や、MS-Windows 2000/XP の機能を使って、awk を お便利に使う手法 を ご紹介します。


【スクリプトのパスを指定しておく。】

  awk は、 awkpath という、 OSの環境変数を指定しておくと、それに設定された、ディレクトリに、 スクリプトファイルを読みにいってくれます。
  環境変数の設定は、以下のように、set コマンドで行います。例えば、
C:\usr>set awkpath=c:\tools\awkscriptawk
  です。
  このように、awkpath を設定しておき、c:\tools\awkscript に、スクリプトファイルを保存していると、 c:\tools\awkscript ディレクトリから優先的にスクリプトファイルを読み込みます。
 例:)  以下のように、同名の スクリプトファイルが、c:\tools\awkscript ディレクトリと、  カレントディレクトリ(C:\usr ディレクトリ)とに、あるとします。
C:\usr>type c:\usr\tmp.awk
BEGIN{
        print "This Script is placed in c:\\usr\\directory."
}

C:\usr>type c:\tools\awkscript\tmp.awk
BEGIN{
        print "This Script is placed in c:\\tools\\awkscript directory."
}
 この時、
C:\usr>set awkpath
awkpath=c:\tools\awkscript
 のように、環境変数 awkpath が設定されていると、
C:\usr>jgawk -f tmp.awk
This Script is placed in c:\tools\awkscript directory.
 のように、スクリプト名だけでスクリプトファイルを指定すると、環境変数 awkpath にセットされた、c:\tools\awkscript に、置いてある、スクリプトファイルを優先的に読み込みます。カレントディレクトリのファイルを確実に指定するためには、 .\ をファイル名の前につける必要があります。
C:\usr>jgawk -f .\tmp.awk
This Script is placed in c:\usr\directory.
 (なお、『 . 』(ピリオド一つ) は、パス指定において、カレントディレクトリを指し、『 \ 』はパスの指定において、ディレクトリ名の区切りです。『 .. 』(ピリオド二つ)は、親(一つ上の階層)のディレクトリを示します。)
 逆にこの点は、注意が必要で、スクリプトの中身を編集変更しているのに、動作が思うようにならないときは、awkpath にセットされたディレクトリに同名のファイルがないかどうかを確認し、スクリプト名を変更するなどの対処をしなければならないといった場合があります。

 以上のように、どこのディレクトリで作業していても、ファイル名だけで、スクリプトを呼び出すことができますので、常用するスクリプトは、決まったディレクトリに保存しておき、コマンドプロンプトを開くときに最初に awkpath を指定する(例えば、awkstart.bat ファイル中で、指定する)と、 お 便 利 で す 。


【コマンド名 (jgawk)を入力せずに使う。】

   Win2K/XP のコマンドプロンプト(cmd.exe)上では、 拡張子を含めたファイル名をコマンドラインで打つと、関連付けされた アプリケーションが開く仕様になっている。 これを利用して、
	ASSOC .awk=AwkScript
	FTYPE AwkScript=jgawk.exe -f %1 %*
とコマンドを打って、一度関連付けをしておくと、コマンドラインで、スクリプト名を入力するだけで、gawk が起動し、スクリプトが処理されるようになります。
(詳細は、assoc /? とか ftype /? とかコマンドラインで入力して、ヘルプを確認のこと。)

普通 awk のスクリプトを実行するには、例えば、
C:\usr>jgawk -f head10.awk *.txt
としますが、一旦関連付けした後は、
C:\usr>head10.awk *.txt
で、OKです。
スクリプトを、コマンドパス(path) の通ったディレクトリに置く(これまでの例では、C:\tools)か、スクリプトの置き場所にパスを通しておく(set path=c:\tools\awkscript;%path% とする。)と、カレントディレクトリ以外でも使えて、お便利です。

   awk で自分用に作った小物ユーティリティを、あたかも普通のプログラムを呼び出すようにコマンドラインで入力して使えます。

【 さらに、拡張子(.awk)の入力も省く 】

さらに、次のようにすると、拡張子なしでもOK。
	set PATHEXT=.awk;%PATHEXT%
スクリプトは、次のようにして起動できるようになります。
C:\usr>head10 *.txt
//注意事項// 上記のように、Unix上でのスクリプトみたいでお便利なのだが、パイプ処理に利用することが出来ません。エラーになります。
C:\usr\awkmemo>dir | head10.awk
c:\tools\gawk.exe: C:\tools\head10.awk:6: fatal: can't stat fd 0 
(Bad file descriptor)

C:\usr\awkmemo>dir | gawk -f c:\tools\head10.awk
-------- The head 10 lines of -----------
 ドライブ D のボリューム ラベルがありません。
 ボリューム シリアル番号は E8AB-D06E です

 C:\usr\awkmemo のディレクトリ

2002/01/28  10:53       <DIR>          .
2002/01/28  10:53       <DIR>          ..
2002/01/28  11:03                1,152 gawk_w2k.txt
2001/12/26  19:09                3,337 1lineawk.htm
2001/12/26  19:09                3,434 awkmemo.htm

まあ、何かプログラム側で工夫すればできるのでしょうが、未検討です。


【 オプション入力省力化(key-macro)】

  MS-Windows 2000/XP には、doskey というコマンドが附属していて、
これを使うと、コマンドを別名で指定できるようになります(コマンドラインマクロ)。

そこで、マクロ定義ファイルに、マクロを記述して、コマンドラインから、
doskey /macrofile=c:\tools\keymacro.ini
と打ってやると、例えば、コマンドを別の名前で実行できたりします。
  この機能を利用して、
cawk=c:\tools\jgawk -F, $*
tawk=c:\tools\jgawk -f tabofs.awk $*
と、マクロ定義してやると、そのようなオプション付きで、実行することができます。
また、よく使うスクリプトは、上記のようなコマンドパス設定をせずに、マクロで、
head=c:\tools\jgawk -f c:\tools\awkscript\head.awk $*
のような、マクロ定義をすると、
C:\usr>head test.txt
のように、実行させることができます。   以下は、今までの話をまとめた、コマンドプロンプトを開くときに自動実行させる awkstart.bat と、マクロ定義ファイル(例えば、keymacro.txt)の例です。

C:\usr>type c:\tools\awkstart.bat
set path=%path%;c:\tools;c:\tools\awkscript;
set pathext=.awk;%PATHEXT%
set awkpath=c:\tools\awkscript;
doskey /macrofile=c:\tools\keymacro.txt

C:\usr>type c:\tools\keymacro.txt
awk =jgawk -W ctype=SJIS $*
head=c:\tools\jgawk -f c:\tools\awkscript\head.awk $*

(注、マクロファイルにおいて、$* は、コマンドラインで与えられる引数全てを示します。)

【 その他の話題 】

【スクリプトを標準入力から読み込ませる】

既に これまでにご紹介していますが、awk では、スクリプトファイル名を - とする、すなわち、
jgawk -f -
とすると、スクリプトを、標準入力から読むようになります。

例:その1(スクリプトを標準入力から読む)

C:\usr>jgawk -F, -f- composer.csv
$2 ~ /.*;B/{
        print $4,$2
}
^Z			<-------- EOF(Ctrl-Z)を入力
1685-1750 Johann(Sebastian);Bach
1714-1788 Karl(Philipp-Emanuel);Bach
1735-1782 Johann(Christian);Bach
1770-1827 Ludwig(van);Beethoven
1833-1897 Johannes;Brahms
1543-1623 William;Byrd
例:その2(パイプ処理のときは前のコマンドの出力をスクリプトとして処理する)
C:\usr>type pi.awk
# pi.awk
# pi/6 = Arctan(1/sqrt(3))
# pi/4 = Arctan(1) = Arctan(1/2) + Arctan(1/3)
BEGIN{
        print "3.1415926535897932386";
        printf("%16.14f", 6 * (atan2(1, sqrt(3))));
        printf("\n");
        printf("%16.14f", 4 * atan2(1, 1));
        printf("\n");
        printf("%16.14f", 4 * (atan2(1, 2) + atan2(1, 3)));
}

C:\usr>type pi.awk | jgawk -f-
3.1415926535897932386
3.14159265358979
3.14159265358979
3.14159265358979
C:\usr>
(注意)したがって、前のコマンドの出力を処理対象のデータとし、スクリプトを標準入力から与えることは出来ないようです。 (この点に関して、断言する自信はありませんが)
C:\usr>dir *.awk | jgawk -f-
^C		(暴走! Ctrl+C で止めた)
C:\usr>


今回は Windows 2000/XP 上で Gnu awk を便利に使う方法を中心にご紹介致しました。

[この頁の先頭へ]    [目次へ戻る]