我有一个10G的巨大文件。我想从此文件中删除188888行。
我使用sed如下:
sed -i '188888d' file
问题是它真的很慢。我理解这是因为文件的大小,但有没有办法我可以更快地做到这一点。
由于
答案 0 :(得分:1)
尝试
sed -i '188888{;d;q;}' file
您可能需要尝试使用上面的哪个分号,{d;q} ...
是第二件尝试。
这将在删除该行后停止搜索文件,但您仍然需要花时间重写该文件。它也值得测试
sed '188888{;q;d;}' file > /path/to/alternate/mountpoint/newFile
备用安装点位于单独的磁盘驱动器上。
最终修改 啊,另一个选择是在通过管道写入文件时编辑文件
yourLogFileProducingProgram | sed -i '188888d' > logFile
但这假设您知道您要删除的数据始终位于第188888行,这可能吗?
我希望这会有所帮助。
答案 1 :(得分:1)
文件行是通过计算\ n字符来确定的,如果行大小是可变的,那么你不能计算给定行的位置的偏移量,但必须计算换行符的数量。
这将始终为O(n),其中n是文件中的字节数。
并行算法也没有帮助,因为这个操作是磁盘IO有限,分而治之甚至会更慢。
如果你要在同一个文件上做很多事情,有办法预处理文件并加快速度。
一种简单的方法是使用
构建索引line#:offset
如果要查找一行,请在索引中对所需的行号进行二进制搜索(Log n),并使用偏移量在原始文件中找到该行。