Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在linux命令行中替换大型文件第一行字符串的最快方法?_Linux_File_Text Processing - Fatal编程技术网

在linux命令行中替换大型文件第一行字符串的最快方法?

在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

我在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/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。此命令可以处理此问题,但速度没有任何提高。正如托马斯所建议的,可能没有更好的方法,除非我保持刺的长度不变。