eis*_*son 32 sed large-files replace
我有 25GB 的文本文件,只需要在几行中替换一个字符串。我可以sed成功使用,但需要很长时间才能运行。
sed -i 's|old text|new text|g' gigantic_file.sql
Run Code Online (Sandbox Code Playgroud)
有没有更快的方法来做到这一点?
mkc*_*mkc 38
你可以试试:
sed -i '/old text/ s//new text/g' gigantic_file.sql
Run Code Online (Sandbox Code Playgroud)
从这个参考:
优化速度:如果需要提高执行速度(由于输入文件大或处理器或硬盘速度慢),如果在给出“s/.../. ../“ 操作说明。
这是一个 10G 文件的比较。前:
$ time sed -i 's/original/ketan/g' wiki10gb
real 5m14.823s
user 1m42.732s
sys 1m51.123s
Run Code Online (Sandbox Code Playgroud)
后:
$ time sed -i '/ketan/ s//original/g' wiki10gb
real 4m33.141s
user 1m20.940s
sys 1m44.451s
Run Code Online (Sandbox Code Playgroud)
简短的回答是“否” - 此类操作的限制因素是磁盘 IO。没有任何方法可以更快地传输 25GB 的磁盘。如果您不就地编辑,并且将结果写入sed单独的驱动器(如果有可用的驱动器),您可能会得到一个小小的改进 - 因为这样您可以从一个驱动器读取,同时写入另一个驱动器,并且有一点从而减少争用。
您也许可以通过不对每行使用正则表达式引擎来加快速度 - 例如使用 perl (我很确定您可以使用它,sed但我不知道语法) - 这将从10,000 行起。
perl -pe '$. > 10_000 && s/old_text/new_text/g'
Run Code Online (Sandbox Code Playgroud)
如果 RE(元字符)中存在任何类型的复杂性,那么最小化这些复杂性将稍微提高正则表达式引擎的效率。