とりあえず使ってみる のバックアップソース(No.2)

RIGHT:寄稿:東條遼平

* ファイルからデータの読み込み [#bab40170]

まずは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を使って数行置きに間引いたところうまく表示することができました。また、全体のグラフではなく、一部のグラフを見たいと思ったときにも活躍します。

* ただ出力をする [#zf4caaa0]

例えば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にクリアされています。

* ファイルから実行する [#fd63fa49]

以上は全てコマンドライン上にプログラムを直接書いていましたが、ちょっと長いときや何度か使うものであればファイルを作ってそこから実行できれば便利です。拡張子などは要らないのですが、自分はAwkのプログラムで分かるようにsin.awkのようにしています。

 BEGIN{for(i=0; i<=100; i++){printf("%1.6f\n", sin(2*.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*.1415*i/100))}}

のようにするとコマンドラインから

 $./sin.awk

のように実行できます。

!/usr/bin/awk -fの部分はAwkのプログラムではないので#を使ってコメントアウトしています。またこれはAwkのパスを書いているのですが、環境によって違うと思います。Awkのパスは、

 $which awk
 /usr/bin/awk

で分かります。最後に実行権を与える必要があるので

 $chmod +x sin.awk

とします。

Valid XHTML 1.1! home >
トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Modified by 物理のかぎプロジェクト PukiWiki 1.4.5_1 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-jiPowered by PHP 5.3.29HTML convert time to 0.002 sec.