我有一个42 GB /620万行的xml文件,我试图将其分解为可管理的大小(它们必须小于1 GB)。目前,我有一个每100,000行创建一个新文件的进程,它工作正常,但它生成了62个文件,这些文件的大小差异很大-从600 MB到1100 MB不等。
如果我可以重写脚本来处理大小限制,我应该在下面的步骤中处理更少的文件。
每一行都以<ent>
开始,以</ent>
结束。
是否有办法修改此脚本,使其每900 MB而不是每100,000行输出一个新文件?
这是我现在的脚本。请注意,我不是特别了解这一切,我已经通过谷歌和试验和错误到这一点。
BEGIN { new_chunk = 1 ; size = 100000 }
NR == 1 { header = $0 ; footer = "</" substr($1,2) ">" ; next }
$0 !~ footer {
if (new_chunk) {
outfile = "ent_" sprintf("%07d", num) ".xml"
print header > outfile
new_chunk = 0
}
print > outfile
}
/<ent>/ {
num = int(count++/size)
if (num > prev_num) {
print footer > outfile
new_chunk = 1
}
prev_num = num
}
END { if (!new_chunk) print footer > outfile }
非常感谢您的光临
1条答案
按热度按时间cigdeys31#
OP还没有提供一个输入文件样本,所以对OP的当前代码进行逆向工程,我提供了这个(假的)文件用于演示:
一个
awk
创意:**注意:**如注解中所述,
length()
函数返回字符数(而不是字节数),因此如果输入文件包含多字节字符,则此代码将少计字节数;处理多字节字符在awk
中是可行的,但是需要更多的编码和/或扩展这会产生: