ここで書かれていることを実行したことによる、パソコンの故障等の問題には一切責任を負えないことを理解した上で、ご利用下さい。
〇 初期設定として、自分がいるディレクトにcshとworldとというディレクトリを作成して、
mkdir csh world
cshディレクトリに移動
cd ./csh/
この時の「./」は自分がいるディレクトリを指しており「自分がいるディレクトリの・・・」という感じの意味になるかと思う。予断だが点が1つ多くなる、つまり「../」のようになると、「1つ上のディレクトリの・・・」という感じになる。本題に戻すと、ここから下のcshスクリプトをcshディレクトリに保存していけば、上手くいくと思うんだけど・・・。
〇 まずGPCCのデータをpasteする作業に入る前に、左のDataの項目の中のGPCCからデータをダウンロードしてください。この時たくさんのデータがあり、面倒臭いので、次のコマンドwgetを行えば上手くいくはず。
#!/bin/csh -f
#
set gpccftp = 'ftp://ftp-anon.dwd.de/pub/data/gpcc/full_data/'
set gpccname = 'gpcc_full_data_archive_v004_05_degree_'
set gpccext = '.zip'
set gpccout = '../world/'
@ year = 1901
@ eyear = 2001
@ fyear = 2007
#
while ( ${year} <= ${eyear} )
@ midyear = ${year} + 9
if ( ${year} == 2001 ) then
wget ${gpccftp}${gpccname}${year}_${fyear}${gpccext}
else
wget ${gpccftp}${gpccname}${year}_${midyear}${gpccext}
endif
@ year = ${year} + 10
end
#
mv ${gpccname}* ${gpccout}
中身は下にも似たような話が出てくるので割愛させて頂くことにして、上のcshスクリプトをtest.cshとでもして保存し次のように打てば実行できるはず。
csh test.csh
あとは、コマンドunzipでも行えば、解凍が出来ると思う。
unzip *.zip
データの中身を見るため、
vi gpcc_full_data_archive_v004_05_degree_011901
とでもすれば、中身が見れるはず。しかし必要な部分はヘッダー部分ではなく、データの部分であり、さらに言うと1行目だけが解析を行ううえで必要になってくる生のデータなので、そこの部分を抽出する。
ただちょっと疲れてきたので、飛ばさせてもらう。分からない人もいると思うので、おいおい書くことにするが、その前にgawkの使い方を勉強してみてください。そしたら、上手くいくはずです。
.....一応例として
gawk ' NR >= 14 {print $1;} ' gpcc_full_data_archive_v004_05_degree_011901 > rainwor190101
gawk ' NR >= 14 {print $1;} ' gpcc_full_data_archive_v004_05_degree_021901 > rainwor190102
gawk ' NR >= 14 {print $1;} ' gpcc_full_data_archive_v004_05_degree_031901 > rainwor190103
...
という感じになりますが、これも繰り返し作業でやってられないと思うので、上述のダウンロードあるいは下記のpasteコマンド等のスクリプトをアレンジしてみてください。そうすると、次のような結果が出てくる。
24.5
34.5
45.8
90.1
...
データの中身を確認する方法には他にもたくさんあり、lessやmore、catや先ほどお話したawkなどがあり、用途に合わせて使い分けれるようになりたいものです。
〇 話を次に進めると、rainwor190101のようにGPCCの1行に並んでいる月降水量のファイルが1901年1月から2007年12月まであるので、これらのファイルを1つのファイルにまとめたいと思う人もいると思う。この時横方向にデータをくっつけていきたい人はコマンドpaste、縦方向にくっつけていきたい人はコマンドcatを用いればできる。今回は1957年1月から2007年12月までのデータを横方向にくっつけていく作業を説明する。具体的な内容に関しては後で説明するとして、まずはcshスクリプトを見てみる。
#!/bin/csh -f
#
set raindir = '../world/rainwor'
set rainout = 'rainwor195701-200712'
@ year = 1957
@ eyear = 2007
#
touch tmp
#
while ( ${year} <= ${eyear} )
@ month = 1
while ( ${month} <= 12 )
if ( ${month} < 10 ) then
paste tmp ${raindir}${year}0${month} > tmp2
rm -f tmp
mv tmp2 tmp
else if ( ${month} >= 10 ) then
wc -l ${raindir}${year}${month} > tmp2
cat tmp tmp2 > tmp3
rm -f tmp tmp2
mv tmp2 tmp
endif
@ month = ${month} + 1
end
@ year = ${year} + 1
end
#
mv tmp ${rainout}
まずsetでこれから使う変数を定義する。そもそもcshで定義される変数は、文字列として扱われるそうで、変数を数字として圧交わさせるためには変数yearと変数eyearと同様、setではなく@を用いる必要があるようだ。
次に、linuxのコマンドの一つであるコマンドtouchを利用して空ファイルを生成した。ちなみに、先ほど説明したようにファイルの中身を確認する方法として、コマンドmore、less、cat、awkなどがあり、awkは少しいじくらないと表示が出来ないが、それ以外のコマンドは次のようにして、表示する。
more tmp
less tmp
cat tmp
さらには、awkを用いると
gawk '{print NR,$0;}' tmp
とか(NRは行数を表示)
gawk '{print $1;}' tmp
とかでも表示できる。しかしそもそも空ファイルであれば、コマンドlsを用いて容量を確認することで、ファイルは生成されているが、中身がないことを確認することが出来るはず。
ls -lsa
ls -ls
ls -l
ls -s
また話がそれてしまったが、次にwhile~endで1957年から2007年までループを繰り返し、さらにそのループの中に1~12月までのループが存在する。しかし、月の場合は01、02、03、04、05、06、07、08、09、10、11、12と保存されているため、if~else if~endifで場合分けする必要がある。どういうことかというと、cshスクリプトを含めほぼ?すべてのプログラミングでは01+1=02なんて都合のいいようには出来ていない。そこで、01~09までは月の変数の前に「0」を代入する形で出力させて、10~12は月をそのまま出力させてやろう、という魂胆で場合分けをしたのである。次に、いよいよコマンドpasteが出てきており、ここでデータを横方向にくっつけていく作業をする。tmpというファイルの右側にスペースを入れた形で${raindir}${year}0${month}をくっつけてtmp2というファイルを生成するという流れである。さらに、とりあえず、コマンドrmでもとあったtmpファイルを削除する。この時つけるオプション「-f」は「データを削除しようとしていますが削除してもいいですか?」というメッセージを表示しないようにするときに用いる。(たくさんのデータを削除するときは一回一回削除していいですよ!!ってEnterを押し続けるのは面倒なのでこのようなオプションがあるが、重大なファイルを削除するときは注意が必要)。さらに余談だが、コマンドrmの際に「-r」オプションをつけると、ディレクトリを削除することが出来る。本題に戻すと、次にコマンドmvが出てきている。これは、データをあるフォルダから違うフォルダに移動させるときにも用いられる。しかし、今回用いたコマンドmvは名前を変えるという意味で用いた。実際にやってみればわかる。
touch tmp
ls
mv tmp tmp2
ls
とすると、何が変わったか分かるはずだ。これで大体説明できたと思うが、結局どうなるかというと、
24.5 45.7・・・
34.5 67.9・・・
45.8 73.1・・・
90.1 67.5・・・
...
これで、自分が必要な年数分のデータをすべて横方向にくっつけることが出来たはず。あとは、色々と試してみてください。
疲れたので、これ以降は自分で考えてください。
最終更新:2008年11月05日 09:40