有没有不需要遍历整个文件就能将文件前 n 行删除的方法?

2014-09-27 22:01:15 +08:00
 RangerWolf
想分析一个10G的文件,奈何开头的几行是说明。虽然目前的程序也能跑下去,但是总是感觉不好,因为每次都得进行判断 if( line.startswith("XXX"))

不知道大家有什么办法吗~
2829 次点击
所在节点    问与答
15 条回复
laputaprince
2014-09-27 22:08:01 +08:00
sed -i -e 1,3d file

1-3 行被删除, in-place 删除。

楼主记得报告一下性能如何。
cbsw
2014-09-27 22:15:23 +08:00
sed 和 awk 就是专门干这种事的,逐行分析日志文件,而不用一次加载整个文件
RangerWolf
2014-09-27 22:17:27 +08:00
@laputaprince
@cbsw 从没用过这两个东西~ 我还需要自行脑补一下。 多谢指教!
xcv58
2014-09-27 22:25:29 +08:00
head tail grep awk sed 都可以,看具体需求了。
xcv58
2014-09-27 22:40:15 +08:00
刚才搜索了一下,在不改动文件系统的前提下,没有小于 O(n) 的方法。
SoloCompany
2014-09-27 23:13:22 +08:00
既然程序能够识别注释(跳过前几行注释的运行复杂度是 o(0)
你又何苦费尽心思删掉这几行内容?
ffffwh
2014-09-27 23:47:35 +08:00
@xcv58
假设需求是删除前几行,然后保存。
我的疑问是:删完了以后是不是要重新写一遍整个文件?
rrfeng
2014-09-28 00:01:35 +08:00
@ffffwh
显然不是,改动第一个 block 的 inode 就可以了。
rrfeng
2014-09-28 00:10:31 +08:00
另外如果你这几行是固定内容的话,最快的就是 seek 到需要的行了。没有更快的办法……

不过相对于 10G 来说,前几十行真心可以忽略了吧
msg7086
2014-09-28 05:46:52 +08:00
不如合理拆开文件,变成几十个小文件呢…
RangerWolf
2014-09-28 09:04:33 +08:00
@rrfeng 多谢提醒,我看了Java / C# 里面都有提供seek函数。
@xcv58 head tail 应该不能直接删除源文件之中的行吧?
@msg7086 分成小文件也行,只是还是得将源文件处理一遍。 强迫症吧~ 看着不爽 哈哈
ryd994
2014-09-28 11:33:00 +08:00
你先读几行看看是不是,如果是,就立刻处理,然后进循环
ryd994
2014-09-28 11:40:22 +08:00
@laputaprince
@cbsw
@xcv58
@ffffwh
为什么非要修改源文件?
把处理的第一次展开出来不就好了?前几行先扔掉,如果发现是数据,就直接调用一次处理逻辑,然后再进循环。
xcv58
2014-09-28 14:56:20 +08:00
@RangerWolf head tail 只能显示,不会改动内容。你这种情况我一般用 awk 来处理。
xcv58
2014-09-28 14:57:06 +08:00
@rrfeng 请教如何改动 inode

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/136057

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX