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." }のように、環境変数 awkpath が設定されていると、
C:\usr>set awkpath awkpath=c:\tools\awkscriptのように、スクリプト名だけでスクリプトファイルを指定すると、環境変数 awkpath にセットされた、c:\tools\awkscript に、置いてある、スクリプトファイルを優先的に読み込みます。カレントディレクトリのファイルを確実に指定するためには、 .\ をファイル名の前につける必要があります。
C:\usr>jgawk -f tmp.awk This Script is placed in c:\tools\awkscript directory.
(なお、『 . 』(ピリオド一つ) は、パス指定において、カレントディレクトリを指し、『 \ 』はパスの指定において、ディレクトリ名の区切りです。『 .. 』(ピリオド二つ)は、親(一つ上の階層)のディレクトリを示します。)
C:\usr>jgawk -f .\tmp.awk This Script is placed in c:\usr\directory.
逆にこの点は、注意が必要で、スクリプトの中身を編集変更しているのに、動作が思うようにならないときは、awkpath にセットされたディレクトリに同名のファイルがないかどうかを確認し、スクリプト名を変更するなどの対処をしなければならないといった場合があります。
以上のように、どこのディレクトリで作業していても、ファイル名だけで、スクリプトを呼び出すことができますので、常用するスクリプトは、決まったディレクトリに保存しておき、コマンドプロンプトを開くときに最初に awkpath を指定する(例えば、awkstart.bat ファイル中で、指定する)と、 お 便 利 で す 。
Win2K/XP のコマンドプロンプト(cmd.exe)上では、 拡張子を含めたファイル名をコマンドラインで打つと、関連付けされた アプリケーションが開く仕様になっている。 これを利用して、とコマンドを打って、一度関連付けをしておくと、コマンドラインで、スクリプト名を入力するだけで、gawk が起動し、スクリプトが処理されるようになります。
ASSOC .awk=AwkScript FTYPE AwkScript=jgawk.exe -f %1 %*
(詳細は、assoc /? とか ftype /? とかコマンドラインで入力して、ヘルプを確認のこと。)
普通 awk のスクリプトを実行するには、例えば、としますが、一旦関連付けした後は、
C:\usr>jgawk -f head10.awk *.txtで、OKです。
C:\usr>head10.awk *.txt
スクリプトを、コマンドパス(path) の通ったディレクトリに置く(これまでの例では、C:\tools)か、スクリプトの置き場所にパスを通しておく(set path=c:\tools\awkscript;%path% とする。)と、カレントディレクトリ以外でも使えて、お便利です。
awk で自分用に作った小物ユーティリティを、あたかも普通のプログラムを呼び出すようにコマンドラインで入力して使えます。
【 さらに、拡張子(.awk)の入力も省く 】
さらに、次のようにすると、拡張子なしでもOK。スクリプトは、次のようにして起動できるようになります。
set PATHEXT=.awk;%PATHEXT%//注意事項// 上記のように、Unix上でのスクリプトみたいでお便利なのだが、パイプ処理に利用することが出来ません。エラーになります。
C:\usr>head10 *.txtまあ、何かプログラム側で工夫すればできるのでしょうが、未検討です。
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
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 $*
のように、実行させることができます。 以下は、今までの話をまとめた、コマンドプロンプトを開くときに自動実行させる awkstart.bat と、マクロ定義ファイル(例えば、keymacro.txt)の例です。C:\usr>head test.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(スクリプトを標準入力から読む)例:その2(パイプ処理のときは前のコマンドの出力をスクリプトとして処理する)
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(注意)したがって、前のコマンドの出力を処理対象のデータとし、スクリプトを標準入力から与えることは出来ないようです。 (この点に関して、断言する自信はありませんが)
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>