【发布时间】:2017-04-27 18:17:26
【问题描述】:
我有一个非常大(数 GB)的文件,我想对其进行简单操作:
- 在文件末尾添加 5-10 行。
- 在文件开头添加 2-3 行。
- 在开头删除几行,直到某个子字符串。具体来说,我需要遍历文件直到显示“删除我!\n”的行,然后删除文件中直到并包括该行的所有行。
我正在努力寻找一种可以进行就地编辑的工具,而无需创建一个基本上包含我的原始文件副本的临时文件(非常长的任务)。基本上,我想尽量减少对磁盘的 I/O 操作次数。
sed -i 和 awk -i 都做的很慢 (https://askubuntu.com/questions/20414/find-and-replace-text-within-a-file-using-commands),因此效率低下。有什么更好的方法?
我在 Debian 上。
【问题讨论】:
-
echo "blabla" >> bigfile将行添加到末尾。从头开始删除并不容易。最简单的方法是使用临时文件,例如-i或sed '....' file >newfile && mv newfile file -
在开头删除几行,直到某个子字符串 - 你能详细说明一下吗?什么子串和多少行?
-
@RomanPerekhrest 添加了关于它的解释。
-
@AlexWeinstein,你所要求的在很大程度上是不可能的。标准 UNIX 系统调用——用于用户空间应用程序请求文件系统操作的接口——允许就地附加到文件的 end;允许在原始值和新值长度完全相同的情况下进行就地编辑;但不要让您在任何时候追加数据或删除数据(以改变文件总长度的方式),但以不需要重写整个文件其余部分的方式结束。
-
顺便说一句,这是一类问题,通常通过具有删除标志等的索引、日志结构文件格式来解决。也就是说,使用数据库。
标签: performance awk sed io