2017-10-08 42 views
1

我在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命令可以非常快地提取第一列。

+0

请为样本输入添加样本输入和您想要的输出到您的问题。 – Cyrus

+2

这只能在'foo'和'bar'长度相同(以字节为单位)时才能完成。否则,重写整个文件是你唯一的选择(尽管如果工具足够聪明,它可以在原地完成)。 – Thomas

+0

@cyrus我添加了这个例子。 –

回答

0

请问您可以尝试下面的awk命令,并让我知道如果这可以帮助您,我无法测试它,因为我没有500 GB大文件。当然,它不应该在后端创建任何临时文件,因为它不会在Input_file上使用就地替换。

awk 'FNR==1{$1="bar";print;next} 1' Input_file > temp_file && mv temp_file Input_file 
+0

谢谢@ RavinderSingh13。这个命令可以处理这个问题,但速度没有任何改进。正如托马斯所说,除非我保持不变,否则可能没有更好的办法。 –

相关问题