这个问题类似于根据正则表达式分割文本文件,但又不完全相同。我的问题是我不想将其拆分为特定数量的文件,但我实际上想根据匹配的数量来拆分它。例如:我有一个 457 MB 的文件,并尝试将其拆分为更小的文件。以下是目前正在进行的工作:
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”。那么希望文件不要超过10000个。或者事先检查您期望的文件数量。