【发布时间】:2017-10-08 11:06:51
【问题描述】:
我在 linux 机器上有一个巨大的纯文本文件 (~500Gb)。我想在标题行(文件的第一行)中替换一些字符串,但是我知道的所有方法似乎都很慢而且效率低。
示例文件:
foo apple cat
1 2 2
2 3 4
3 4 6
...
预期的文件输出:
bar apple cat
1 2 2
2 3 4
3 4 6
...
sed:
sed -i '1s/foo/bar/g' file
-i 可以原地更改文件,但是这个命令会在磁盘上生成一个 tmp 文件,并使用 tmp 文件替换原来的文件。 io浪费时间。
vim:
ex -c '1s/foo/bar/g' -c 'wq' file
vim 不会生成 tmp 文件,但是这个工具会将整个文件加载到内存中,这也很浪费时间。
有没有更好的解决方案,只将第一行读入内存并将其写回原始文件?我知道linuxhead命令可以非常快的提取第一列。
【问题讨论】:
-
请在您的问题中添加示例输入和该示例输入所需的输出。
-
这只能在
foo和bar的长度相同(以字节为单位)时完成。否则,重写整个文件是你唯一的选择(尽管如果工具足够聪明,它可以就地完成)。 -
@cyrus 我已经添加了示例。
-
@Thomas 新字符串和旧字符串的长度不同。似乎重写文件是唯一的解决方案,但我仍然想知道哪个命令是最快的方法。
标签: linux file text-processing