多数のファイルの処理

データ解析では、多数のデータファイルに対して同様の処理を行う必要のある時がよくある。 このような場合に UNIX 系 OS の強みである強力なシェルの力を借りるのが 非常に有効である。例えば

一日1つのデータファイルがあり、その名前が YYYYMMDD.dat である (例えば 2002年1月3日のデータは 20020103.dat に格納されている) と言った場合に ある処理をするプログラム process を1月のデータ全てにかけたい場合、以下のような 解決策がある。

まず、C なり Fortran なりの処理プログラム process に対して必要な情報は 起動時の引数の形で与え、処理結果をあるファイル result に書き足していく ことにしておけば、tcsh を使って


rm result
foreach t (データのあるディレクトリ名/200201??.dat)
処理ソフトのあるディレクトリ名/process $t >> result
end

などと処理できる。この通りに対話的にキーボードから打ち込んでも良いが、 このような一連のコマンド群をファイルに書き込んでおきそれを
tcsh ファイル名

として、実行させても良い。研究の場合、処理の手直し&再実行というのは 頻繁に行われるので、後者のファイルに書く方法を勧めたい。

もうちょっと複雑な例

また、処理の中間段階として各日のデータ yyyymmdd.dat の 処理結果を yyyymmdd.res1 として格納する場合は
foreach t (データのあるディレクトリ名/200201??.dat)
処理ソフトのあるディレクトリ名/process $t  > $t:r.res1
end

などと処理できる。詳しくは、tcsh のマニュアルなどを参照のこと

もうちょっと複雑な例としては、年/月 というディレクトリに yyyymmdd.dat が 保存されているというような場合には、process の返り値として、実行に成功すれば 0 (成功) を失敗すれば それ以外 (不成功) を返すことにし (要するにデータファイルが無ければ失敗するようにしておき )、


set PROGDIR=処理ソフトのあるディレクトリ名
set DATADIR=データのあるディレクトリ名
foreach s (2000 2001 2002)
foreach t (01 02 03 04 05 06 07 08 09 10 11 12)
foreach u (0 1 2 3)
foreach v (0 1 2 3 4 5 6 7 8 9)
$PROGDIR/process $DATADIR/$s/$t/$s$t$u$v.dat > tmpresult && mv tmpresult $s$t$u$v.res1
end
end
end
end

などとすることができる。データ処理の参考にして欲しい。

もちろん、C なり Fortran なりで、必要なファイル名を作成して読み込み処理するという方法も有効な方法であり、複雑な処理の場合はその方が良いことも多い。

2002.10 玉川
戻る , 作者のページへ , 研究室のページへ