ここで書かれていることを実行したことによる、パソコンの故障等の問題には一切責任を負えないことを理解した上で、ご利用下さい。

〇 GPCCの1行に並んでいる月降水量のファイルの行数をカウントする作業を行う。そしてどのファイルがどれだけの行数であるかを確認する。GPCCのデータのpasteのページを読んでから、このページを読んだ方が、多少しっくり来ると思う。
では本題に入るが、具体的な内容に関しては後で説明する。まずはcshスクリプトを見てみる。

#!/bin/csh -f
#
set raindir = '../world/rainwor'
@ year = 1901
@ eyear = 2007
#
touch tmp
#
while ( ${year} <= ${eyear} )
  @ month = 1
  while ( ${month} <= 12 )
    if ( ${month} < 10 ) then
      wc -l ${raindir}${year}0${month} > tmp2
      cat tmp tmp2 > tmp3
      rm -f tmp tmp2
#      rm -f tmp
      mv tmp3 tmp
    else if ( ${month} >= 10 ) then
      wc -l ${raindir}${year}${month} > tmp2
      cat tmp tmp2 > tmp3
      rm -f tmp tmp2
#      rm -f tmp
      mv tmp3 tmp
    endif
    @ month = ${month} + 1
  end
  @ year = ${year} + 1
end
#
mv tmp rainwor_wc_line

中身を説明する前に、これ空説明することに関しては違うページと重複している部分もあるので、飛ばしたい人は飛ばして読んでください。
まずsetでこれから使う変数を定義する。そもそもcshで定義される変数は、文字列として扱われるそうで、変数を数字として圧交わさせるためには変数yearと変数eyearと同様、setではなく@を用いる必要があるようだ。
次に、linuxのコマンドの一つであるコマンドtouchを利用して空ファイルを生成した。ちなみに、ファイルの中身を確認する方法として、コマンドmore、less、cat、awkなどがあり、awkは少しいじくらないと表示が出来ないが、それ以外のコマンドは次のようにして、表示する。

more tmp
less tmp
cat tmp

さらには、awkを用いると

gawk '{print NR,$0;}' tmp

とか

gawk '{print $1;}' tmp

とかでも表示できる。しかしそもそも空ファイルであればコマンドlsを用いて、容量を確認すれば、ファイルは生成されているが、中身がないことを確認することが出来るはず。

ls -lsa
ls -ls
ls -l
ls -s

また話がそれてしまったが、次にwhile~endで1901年から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は月をそのまま出力させてやろう、という魂胆で場合分けをしたのである。そして、まずコマンドwcで求めたいファイルの行数をtmp2に格納する作業を行う。この時つけるオプション「-l」は「行数」を出力してください、という作業を行いたいときに用いる。さらに、コマンドcatで出力した行数を縦方向にくっつけていく作業を行い、tmp3を出力する。コマンドrmで元のtmpを削除した。また余談になってしまうが、rmのオプションについて説明すると、「-f」は「本当にそのファイルを消していいかどうかを確認するメッセージを表示しない時に用いる」(←たくさんのデータを削除するときは、めんどくさいので用いた方がいいと思うが、大事なデータを削除するときには注意が必要)このコマンドrmの行を使わないで、次の行のコメント行を用いても上手く行く。なぜなら、「>」はコマンドの実行結果をファイルに「上書きする形で」出力されるためである。ちなみに「>>」の場合は、「追記する形」で出力される。試してみれば分かるはず。

ls > tmp1
less tmp1
ls ../ > tmp1
less tmp1

ls > tmp2
less tmp2
ls ../ >> tmp2
less tmp2 

本題に戻すと、次にコマンドmvが出てきている。これは、データをあるフォルダから違うフォルダに移動させるときにも用いられる。しかし、今回用いたコマンドmvは名前を変えるという意味で用いた。実際にやってみればわかる。

touch tmp
ls
mv tmp tmp2
ls

とすると、何が変わったか分かるはずだ。これで大体説明できたと思うが、結局どうなるかというと、

259200 ../world/rainwor190101
259200 ../world/rainwor190102
259200 ../world/rainwor190103
...

これで、すべてのファイルの行数を確認することが出来る。
疲れたので、これ以降は自分で考えてください。


2008/10/29 17:56:06
足あと -
最終更新:2008年10月29日 17:56