在linux命令行中替换大型文件第一行字符串的最快方法?
我在linux机器上有一个巨大的纯文本文件(~500Gb)。我希望在头行(文件的第一行)中替换一些字符串,但是我知道的所有方法似乎都很慢,效率也很低 示例文件:在linux命令行中替换大型文件第一行字符串的最快方法?,linux,file,text-processing,Linux,File,Text Processing,我在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 ex -c '1s/foo/ba
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
ex -c '1s/foo/bar/g' -c 'wq' file
-i
可以就地更改文件,但此命令会在磁盘上生成一个tmp文件,并使用该tmp文件替换原始文件。io浪费时间
vim:
sed -i '1s/foo/bar/g' file
ex -c '1s/foo/bar/g' -c 'wq' file
vim不会生成tmp文件,但是这个工具会将整个文件加载到内存中,这也会浪费很多时间
是否有更好的解决方案,只将第一行读入内存,然后将其写回原始文件?我知道linux
head
命令可以非常快地提取第一列。请尝试执行awk命令,并让我知道如果这对您有帮助,我无法测试它,因为我没有像500 GB这样的大文件。当然,它不应该在后端创建任何临时文件,因为它没有在输入文件上使用就地替换
awk 'FNR==1{$1="bar";print;next} 1' Input_file > temp_file && mv temp_file Input_file
请您尝试下面的awk命令,并让我知道,如果这对您有帮助,我无法测试它,因为我没有像500 GB这样的大文件。当然,它不应该在后端创建任何临时文件,因为它没有在输入文件上使用就地替换
awk 'FNR==1{$1="bar";print;next} 1' Input_file > temp_file && mv temp_file Input_file
请将样本输入和该样本输入的所需输出添加到问题中。只有当
foo
和bar
长度相同(以字节为单位)时,才能执行此操作。否则,重写整个文件是您唯一的选择(尽管如果工具足够智能,它可以在适当的位置完成)。@cyrus我已经添加了示例。@Thomas新字符串和旧字符串的可能重复长度不同。似乎重写文件是唯一的解决方案,但我仍然想知道哪个命令是最快的方法。请将示例输入和该示例输入的所需输出添加到您的问题中。这只能在foo
和bar
长度相同(以字节为单位)的情况下进行。否则,重写整个文件是您唯一的选择(尽管如果工具足够智能,它可以在适当的位置完成)。@cyrus我已经添加了示例。@Thomas新字符串和旧字符串的可能重复长度不同。似乎重写文件是唯一的解决方案,但我仍然想知道哪个命令是最快的方法。谢谢@RavinderSingh13。此命令可以处理此问题,但速度没有任何提高。正如托马斯所建议的,除非我保持刺的长度不变,否则可能没有更好的方法。谢谢@RavinderSingh13。此命令可以处理此问题,但速度没有任何提高。正如托马斯所建议的,可能没有更好的方法,除非我保持刺的长度不变。