スタンドアロンawkスクリプトファイルを作成する方法を理解しようとしています。
スタンドアロンのbashスクリプトファイルに似ていると思います。
#! /usr/bin/awk -f
BEGIN{
for (i = 0; i < ARGC; i++)
printf "%s ", ARGV[i]
printf "\n"
}
{print $0}
シェルでコマンドライン引数を指定し、それをスクリプトに渡す方法を見つけようとしています。
$ myscript.awk arg1 arg2 arg3 awk arg1 arg2 arg3 awk: /home/tim/myscript.awk:5: fatal: cannot open file `arg1' for reading (No such file or directory)
awkスクリプトにはどのコマンドライン引数が必要ですか?
arg1
入力ファイルになると予想されるのはなぜですか?コマンドライン引数はawkスクリプトに渡され、ARGV配列に格納されます。私のアップデートをご覧ください。だからコマンドライン引数は
awk
。-f
shebangを削除すると、つまり#! /usr/bin/awk
$ myscript.awk arg1 arg2 arg3 awk: cmd. line:1: /home/tim/myscript.awk awk: cmd. line:1: ^ syntax error
なぜ
-f
必要ですか?
ありがとうございます。
ベストアンサー1
AWKは、引数がスクリプトのテキストであるか、-f
実行されるスクリプトを含むファイル名が続くことを期待しています。どちらの場合も、オプションで処理するファイル名が続きます。
これがshebang行が必要な理由を説明します-f
。この行がなければ、AWKはスクリプトのファイル名自体が実行されるAWKステートメントだと思います。
パラメータ処理に関して、AWKプログラムは必要に応じて独自のパラメータ処理を実行できます。次の行でスクリプトが{print $0}
失敗します。これは、インタプリタが入力(一部指定したため、コマンドラインに名前が付けられたファイル)から各行を読み取り、ブロックの指示に従って処理するように指示します。その行を削除するとエラーは発生しません。パラメータを処理して入力ファイルのみを含めるようにBEGIN
削除すると、AWKは文句を言いません。ARGV
独自のパラメータと入力処理を試みることは、AWKを非常に便利にする多くのものを無視することを意味できます。そうしたい場合は、Perlを使用することをお勧めします。
(shebang処理は単純なAWKスクリプトをファイル名に保存できることを意味するので、スクリプトの賢い名前を見つける必要はありません。誰もそうしないでください...)