まずはAwkで一番使うであろうファイルのデータ処理をやってみます.謎な文字が出てくるかと思いますが,今回は何も考えずに打ち込んでみてください.例えば次のようにデータが入っているファイルがあるとします.
$less sindata 0.000000 0.062789 0.125330 0.187376 0.248683 0.309008 0.368114 0.425768 0.481741 0.535813
このときデータを全て足し合わせたいと思えば
$awk '{sum += $1}END{print sum}' sindata 2.74462
と計算してくれます.また1行置きに出力したいときは,
$ awk 'NR%2{print}' sindata 0.000000 0.125330 0.248683 0.368114 0.481741
と簡単に行えます.もちろん標準出力ですので,
$ awk 'NR%2{print}' sindata > sindata2
とリダイレクトすることで結果をsindata2に出力することができます.
こんなことをやって何が楽しいかというと,例えば音声ファイルのサンプリング情報や周波数情報などをグラフ化したいと思ってgnuplotに放りこむとします.しかし,データが膨大すぎて自分の環境では表示することができませんでした.そんなときにawkを使って数行置きに間引いたところうまく表示することができました.また,全体のグラフではなく,一部のグラフを見たいと思ったときにも活躍します.
例えばsinを1周期分100等分にして値を出力したいとき,
$ awk 'BEGIN{for(i=0; i<100; i++) {printf("%1.6f\n", sin(2*3.1415*i/100))}}' > sindata
のようにするとsindataに値が出力されます.このときBEGINの括弧のなかはC言語と全く文法が同じです.違うのは変数iの宣言をせずに使っているところです.awkでは初期値は0にクリアされています.
以上は全てコマンドライン上にプログラムを直接書いていましたが,ちょっと長いときや何度か使うものであればファイルを作ってそこから実行できれば便利です.拡張子などは要らないのですが,自分はAwkのプログラムで分かるようにsin.awkのようにしています.
BEGIN{for(i=0; i<=100; i++){printf("%1.6f\n", sin(2*3.1415*i/100))}}
上のプログラムをsin.awkと保存していれば
$awk -f sin.awk
とすればsin.awkから読み込んで実行してくれます.ファイルから実行するときは-fを書いてやる必要があります.また,
#!/usr/bin/awk -f BEGIN{for(i=0; i<=100; i++){printf("%1.6f\n", sin(2*3.1415*i/100))}}
のようにするとコマンドラインから
$./sin.awk
のように実行できます.
!/usr/bin/awk -fの部分はAwkのプログラムではないので#を使ってコメントアウトしています.またこれはAwkのパスを書いているのですが,環境によって違うと思います.Awkのパスは,
$which awk /usr/bin/awk
で分かります.最後に実行権を与える必要があるので
$chmod +x sin.awk
とします.