FGALDC 17 ファイル群の結合と分割 ども。 私、今まで複数のファイルの結合というと、生ログファイルを1ヶ月分結合させ る、といったことしかしてこなかったんですね。この場合、1回結合させたらそ れっきりなんで、結合の順番だけは気を使いますが、それ以外はあまり考慮する 必要がありませんでした。 具体的には、極めて原始的なんですが、コマンドラインから >COPY 990101.*+990103.*+(中略)+990129.* 990100.LOG みたいな感じで手作業で行ってきました。なお、ここで拡張子にワイルドカード を使っていますが、これはいちいち LOG と打つよりも文字数が節約できるからこ うしているだけで、それ以上の意味はありませんし、複数のファイルが該当して しまうようなことも生じないようになっております。 さて、最近、複数のファイル群を結合して編集し、その後に分割して元に戻すと いうニーズが生じてきました。具体的には、章とか節とか毎に1つのファイルに なっており、ファイル総数は例えば50個とします。これに、例えば用語の統一 のための一括置換などをしなければならないとします。 でも、50個ものファイルをいちいち開いて閉じて、なんていうのは到底やって いられない。ということで、全部結合してまとめて編集をかけて、最後にもう一 度ばらせばいいじゃないか、と考えました。でも、単純にくっつけただけでは、 あとからばらすのが難しいんですよね。 ということで、次のような手順を考えました。 結合: (1) 結合したいファイルを結合する順番に並べたファイルを作る。このファイルの 形式は1行1ファイル名の、いわゆるレスポンスファイル形式。 (2) 各ファイルの先頭に区切り行を入れながら1つのファイルに出力する。 区切り行の形式は全角星印+半角空白+ファイル名とする。 例−>☆ B:\SAMPLE\CH01SE01.TXT 編集: 必要な編集作業を施す。 併せて、分解時のために区切り行のファイル名のパス部分を書き換える。 分解: 区切り行に記述してあるファイル名に分解しつつ出力。もし編集時にパス名が 変更してなければ、この時に元データに上書きされてしまう。 特に難しいところはありません。 レスポンスファイルを作るところも、もしかしたらVzのファイラーでできるか もしれませんが、一旦ファイルを開いて順番になっているか確認した方がいいか もしれません。あるいは、何も考えずにソートをかけるとか。 あとは、このレスポンスファイルに基づき、ファイルを結合するAWKのスクリ プトと、結合されているファイルを分割するスクリプトを書きました。以下のよ うな感じです。 KETUGOU.AWK>------------------------------------ #jgawk -f KETUGOU.AWK i:\files.$$$ #出力ファイルは決め打ち { print "☆ " $0 >> "i:\\target.txt" cmdline="type " $0 " >> i:\\target.txt" system(cmdline) } KETUGOU.AWK>------------------------------------ BUNKATU.AWK>------------------------------------ #jgawk -f BUNKATU.AWK i:\target.txt /^☆/{ outfile=$2 next } { print $0 > outfile } BUNKATU.AWK>------------------------------------ いやぁ、速い速い。 何というか、AWKさまさまといった感じですね。 この2つのスクリプトのおかげで、しばらくは楽ができそうな感じです。 あとは、レスポンスファイルを作る部分をどうするか、ですかね。でも、ファイ ル数が100個になろうが1000個になろうが、作る必要があるのはファイル 名を列挙したレスポンスファイル1個だけなわけですから、そんなに手間でもな いでしょう。 編集の際にパス名の変更を忘れるのが恐ろしいなら、あらかじめテンポラリファ イルに全部コピーするなりリネームするなりしてフェイルセーフを計っておくの が吉かな。 逆にいえば、結合時とは異なるファイルに分割することだってできるのだから、 編集時になんとかする、という選択肢もあるでしょうが、編集時はなるべく本題 の編集に集中したいというのもあるし、でもパス名の変更だけなら最初に一回一 括置換するだけなので大して手間にもならないかな、と。 なお、ロングファイル名に対応するためには、gawk や mawk 等の、32ビットの AWKが必要でしょう。                                  としき