この質問は次のようになります。正規表現に基づいてテキストファイルを分割するしかし、まったく同じではありません。私の問題は、特定の数のファイルに分割したくないが、実際には一致する数に応じて分割したいということです。例:457MBのファイルがあり、それをより小さなファイルに分割しようとしています。現在進行中の作業は次のとおりです。
csplit -z Scan.nessus /\<ReportHost/ '{*}'
ただし、これにより約61.5k個のファイルが生成されました。トーン<ReportHost
これは457MBファイルのエントリです。最終的にすべての項目ではなく50項目ごとに分割したいと思います。
これを達成するために修正する方法はありますか?これをRubyである程度やろうとしていますが、Nokogiriを使ってファイルを解析しようとすると、仮想マシンのメモリが消費されるようです。
答え1
再利用awk
- 方法
BEGIN{outfile="part_0" ; j=-1}
/\<ReportHost/ {j++}
j==50 {outfile="part_"++i ; j=0}
{print > outfile}
次に実行
awk -f split.awk Scan.nessus
処理中に古いファイルを削除できないという問題がまだ存在します。
ゼロパディング出力ファイルの場合は、次のものを使用できます。
outfile="part_"sprintf("%04d",i++)
BEGINブロックの「part_0000」です。それでは、ファイル数が10,000個を超えていないといいでしょう。または、予想されるファイル数を事前に確認してください。