【问题标题】:Fastest way to replace string in first row of huge file in linux command line?在linux命令行中替换大文件第一行中的字符串的最快方法?
【发布时间】: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命令可以非常快的提取第一列。

【问题讨论】:

  • 请在您的问题中添加示例输入和该示例输入所需的输出。
  • 这只能在foobar 的长度相同(以字节为单位)时完成。否则,重写整个文件是你唯一的选择(尽管如果工具足够聪明,它可以就地完成)。
  • @cyrus 我已经添加了示例。
  • @Thomas 新字符串和旧字符串的长度不同。似乎重写文件是唯一的解决方案,但我仍然想知道哪个命令是最快的方法。

标签: linux file text-processing


【解决方案1】:

您能否尝试执行 awk 命令,如果这对您有帮助,请告诉我,我无法测试它,因为我没有像 500 GB 这样的大文件。确保它不应该在后端创建任何临时文件,因为它没有在 Input_file 上使用就地替换。

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

【讨论】:

  • 谢谢@RavinderSingh13。这条命令可以解决这个问题,但是速度没有任何提升。正如 Thomas 建议的那样,可能没有更好的方法可以做到这一点,除非我保持针刺长度不变。
猜你喜欢
  • 2011-05-16
  • 2019-01-16
  • 2012-09-09
  • 2013-09-21
  • 1970-01-01
  • 2010-11-17
  • 2013-12-27
  • 2012-11-24
相关资源
最近更新 更多