从文件中快速删除带索引的行

时间:2011-10-28 22:33:31

标签: shell sed awk

我有一个10G的巨大文件。我想从此文件中删除188888行。

我使用sed如下:

sed -i '188888d' file

问题是它真的很慢。我理解这是因为文件的大小,但有没有办法我可以更快地做到这一点。

由于

2 个答案:

答案 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),并使用偏移量在原始文件中找到该行。