今回はAWKで実際の温度データを処理してみます。ここでは日本の真ん中あたりにある長野県松本市の気温データを使用します。これは気象庁が公開しているデータです。利用規約では出典とURLを記述することになっていますので以下に該当ページのURLを示します。
出典:気象庁ホームページ
この年間の温度データをタブ区切りテキストとして保存し利用します。ファイル名はdata.txtとしこれまでと同じようにデスクトップのsampleディレクトリに入れておきます。なお、温度データ内に幾つかの記号が含まれているため、それらの記号は削除してあります。また、執筆時点(2024/12)でのデータとなっているため一部の温度データは暫定となっています。
data.txtの中身は以下のようになっています。
必要なデータを表示
これまでのAWKの復習も兼ねて順番に処理していきます。まず、全データを表示して見ます。これは以下のようにコマンドを入力します。
awk {print} data.txt
データによっては先頭の1行が不要な場合があります。項目を示すヘッダーがついていることがありますが、データを処理する場合は不要なことがあります。このような場合、先頭の1行を削除したファイルを作成する方法と先頭の1行をスキップする方法があります。AWKで先頭の1行をスキップして表示するには以下のようにします。
awk 'NR>1{print}' data.txt
それでは次に2000年より後のデータを表示してみます。この場合、年数は最初の1列目になっていますので、この値を読み込んで2000年より後のデータかどうかを判別すればよいことになります。最初の1列目の値は$1に入りますので以下のように$0>2000として判断します。その際、先頭の1行もスキップする必要があるので&&を使って複数の条件を満たすように指定します。
awk 'NR>1&&$0>2000{print}' data.txt
1月の気温だけを表示するには以下のように指定します。
awk 'NR>1{print $2}' data.txt
年数を表示しないとわからない場合は以下のように$1を加えます。
awk 'NR>1{print $1,$2}' data.txt
データが何年分あったか確認したい場合は以下のようにします。今回のデータの場合、先頭の1行分を除く必要があるため行番号を示すNRから1を引きます。
awk 'END{print NR-1}' data.txt
無理にAWKで処理しなくてもwcコマンドとパイプを使う方法もあります。
awk 'NR>1{print $1}' data.txt | wc -l
1月の最低気温と最高気温を求める
次に最低気温と最高気温を求めてみます。まず、1月だけに絞って最低気温と最高気温を求めます。このような場合、AWKで全部処理しようとせずに他のコマンドを組み合わせて利用する方がUNIX的です。
AWKで1月のデータを出力しsortコマンドで並び替えれば簡単にできます。
awk 'NR>1{print $2}' data.txt | sort -n
上記のコマンドではすべてのデータが表示されてしまいます。必要なのは最低気温、つまり先頭1行だけです。この場合はheadコマンドを使って1行だけ抜き出します。
awk 'NR>1{print $2}' data.txt | sort -n | head -n 1
最高気温の場合は先頭ではなく最終行なのでtailコマンドを使えばよいことになります。
awk 'NR>1{print $2}' data.txt | sort -n | tail -n 1
最低気温、最高気温を求めることはできましたが、いつの年の気温なのかがわかりません。やはり年数も同時に表示しないとわかりません。そこで、今度は年数も同時に表示してみます。年数は$1なので$1も出力するようにします。
次にsortで気温の列をキーにしてソートするようにオプションを指定します。最低気温の場合は以下のようになります。
awk 'NR>1{print $1,$2}' data.txt | sort -k2,2 -n | head -n 1
awk 'NR>1{print $1,$2}' data.txt | sort -k2,2 -n | tail -n 1
全体での最低気温と最高気温
先ほどは単月(1月)だけの最低気温と最高気温を求めました。単月ではなく、これまでのすべてのデータ内での最低気温、最高気温を求めたい場合があります。
その年での最低気温を表示するには以下のようになります。
awk 'NR>1{ min=$2; for(i=3; i<=13; i++) if($i<min) min=$i; print $1, min }' data.txt
さらに気温の低い順に表示するにはsortコマンドを組み合わせます。
awk 'NR>1{ min=$2; for(i=3; i<=13; i++) if($i<min) min=$i; print $1, min }' data.txt | sort -k2,2 -n
データ内で最も低い気温の年を表示する場合は以下のようになります。
awk 'NR>1{ min=$2; for(i=3; i<=13; i++) if($i<min) min=$i; print $1, min }' data.txt | sort -k2,2 -n | head -n 1
awk 'NR>1{ max=$2; for(i=3; i<=13; i++) if($i> max) max=$i; print $1, max }' data.txt | sort -k2,2 -n | tail -n 1
データを視覚化したい場合はgnuplotやAIを使って処理してみるとよいでしょう。 ということで、また次回。
著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。



































