在linux命令行中用最大的文件替换字符串的最快方法?
问题描述:
我在linux机器上有一个巨大的纯文本文件(〜500Gb)。我想要在标题行(文件的第一行)中替换一些字符串,但是我所知道的所有方法似乎都很慢且效率较低。在linux命令行中用最大的文件替换字符串的最快方法?
例如文件:
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
罐体C将文件上传到适当位置,但该命令在磁盘上生成一个tmp文件并使用tmp文件替换原始文件。 io浪费时间。
VIM:
ex -c '1s/foo/bar/g' -c 'wq' file
Vim不会产生tmp文件,但这个工具加载到内存中的整个文件,要么浪费了很多时间。
是否有更好的解决方案,只读取第一行内存并将其写回原始文件?我知道linux head
命令可以非常快地提取第一列。
答
请问您可以尝试下面的awk命令,并让我知道如果这可以帮助您,我无法测试它,因为我没有500 GB大文件。当然,它不应该在后端创建任何临时文件,因为它不会在Input_file上使用就地替换。
awk 'FNR==1{$1="bar";print;next} 1' Input_file > temp_file && mv temp_file Input_file
+0
谢谢@ RavinderSingh13。这个命令可以处理这个问题,但速度没有任何改进。正如托马斯所说,除非我保持不变,否则可能没有更好的办法。 –
请为样本输入添加样本输入和您想要的输出到您的问题。 – Cyrus
这只能在'foo'和'bar'长度相同(以字节为单位)时才能完成。否则,重写整个文件是你唯一的选择(尽管如果工具足够聪明,它可以在原地完成)。 – Thomas
@cyrus我添加了这个例子。 –