awkでデータを抽出

awkというのはテキストデータを処理するためのプログラムで、
データを並べ替えたり、抽出する時に役立ちます。
今回はawkを使って、調査データから必要な情報を抽出してみます。

今回はこちらのデータを使用します。以下のファイルをダウンロードし、
GMT作業用ファルダに保存してください。
dummy_density.txt
これは乱数で作ったデータなので数値に意味はありません。
別な海域で試したい人はこちらを使って自分でデータセットを作ってみてください。
架空の調査結果.xls


今回使用するdummy_density.txtは
No. 月 日 経度 緯度 水深 水温 密度
というデータが記録されています。
まず、ここから水深0mの表層水温を抽出し、GMTで使用できるデータの形にします。
以下のコマンドです。
ここからダウンロードできます。
-----------------------------------------
region=144/147/39/42
data=dummy_density.txt
extract_data=extract_sst.txt
grd_file=extract_sst.grd
awk '($6==0){print $5,$4,$7}' $data > $extract_data
surface $extract_data -G$grd_file -I1m -R$region -T0.2
-----------------------------------------
awkは上のように、
awk 'コマンド' ’データファイル’ > 出力先(保存するファイル名)
という形で使用します。
5行目のawkは
データファイルの6列目(水深)が、0である場合に($6==0)、
5列目(経度)、4列目(緯度)、7列目(水温)の順番で
extract_sst.txtというテキストファイルに記録するというコマンドになっています。
6行目で、extract_sst.txtという水温と緯度経度のデータファイルを
GMTで扱うために、extract_sst.grdというGRDファイルに変換しています。


5行目の$6==0の部分を書き換えると、他にもいろいろと抽出できます。
例1 水深200mより浅い調査点とその水温を抽出
awk '($6<200){print $5,$4,$7}' $data > $extract_data
例2 水深200mより浅く、水温が5℃以上の調査点とその水温を抽出
awk '($6<200 && $7>5  ){print $5,$4,$7}' $data > $extract_data
例3 8月に行われた調査の調査点、水温、密度を抽出
awk '($2==8  ){print $5,$4,$7,$8}' $data > $extract_data
このようにさまざまな条件を設定し、テキストデータを抽出することが可能になります。
膨大なデータからデータ抽出が必要な時はこのawkが便利です。

パイプ( | )

少し前でも触れましたが、
上のコマンドはパイプを使うと以下のように書き換えられます。
-----------------------------------------
region=144/147/39/42
data=dummy_density.txt
extract_data=extract_sst.txt
grd_file=extract_sst.grd
awk '($6==0){print $5,$4,$7}' $data | surface  -G$grd_file -I1m -R$region -T0.2
-----------------------------------------
パイプはUNIXで使われる手法の1つで
複数のコマンドをまとめて使う時に使用します。
ここではawkで抽出されたデータ(extract_sst.txtの部分)を保存(出力)せずに、
直接surfaceコマンドに渡しています。
大きなプログラムを作る時は、パイプを使ったほうが処理が速いのでお勧めです。

最終更新:2009年02月10日 15:44