awk 演習: ファイルを分割する2008年11月18日 06時11分53秒

ファイルを複数に分割する必要がでてきた。普通に行毎、バイト毎の塊にファイルを分割をするのであれば、split がある。しかし、今回やりたいのは、行毎にラウンドロビンで複数のファイルに分けたいのだ。

例えば、二つのファイルに分けるとしよう。奇数行をファイルに、偶数行を二つ目のファイル分ける。パフォーマンスの計測や負荷テストなどで、入力ファイルを複数に分割するときなどに、このような分割を行うことがある。一つのプロセスでは賄い切れないので、複数からデータを供給するのだが、データの順番などを出来るだけ保つようにする為だ。


awk '{print > ++i ".txt"; if(i > 1)i = 0}'

これに入力ファイル渡すと、1.txt と 2.txt に交互に書き出される。もし、三分割をしたいのなら 1 を 3 に、七分割をしたいのなら 7 に置き換える。i ".txt" が文字列の連結として扱われて、1.txt などのファイル名に変わる。

一部の awk の実装だと、このように print 先に評価文があると警告をだすものもある。


awk '{print > sprintf("%d.txt". ++i); if(i > 1)i = 0}'

sprintf で回避出来ることもある。もしこれで警告が出るのであれば、ファイル名を一時変数に入れて、print > file のすれば、ファイルのリダイレクトを実装している awk なら、どれでも動く。

実行例だ。


% nawk '{print >  sprintf("%d.txt", ++i); if(i > 1)i = 0}'
1
2
3
4
5
6
% head *
==> 1.txt <==
1
3
5

==> 2.txt <==
2
4
6

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2008/11/18/3953270/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。