在 Linux 中部分打开并修改文本文件

在 Linux 中部分打开并修改文本文件

我有一个非常大的文件 (~450MB),需要很长时间才能完全加载 (并保存),但我只需要更改始终位于同一位置 (相同行号) 的几行。文件已生成,我无法控制格式。

有没有办法只读取和写入这些行?

答案1

要处理大文件,您可以选择以下两种方法之一:使用可以轻松处理大文件的可视化编辑器或以编程方式逐行编辑。也就是说,对于许多编辑器来说,450MB 的文件应该不成问题。

  1. 是一款能够很好地处理大文件的文本编辑器。

  2. 如果您事先知道哪些行需要编辑,即无需查看文件内容(按行号或搜索)即可识别它们sedawk则 或之一perl可能是有效的替代方法。您可能希望在编辑之前打印您感兴趣的行。


基准:所有这些解决方案在理论上都很有效,但哪一个能为您节省最多的时间?

为了很粗糙的基准测试,我在具有 2vCPU(Xeon E5-2690 @2.90GHz)、2GB RAM 和 RAID SSD 的 KVM VPS 上创建了一个 1GB、3300 万行的文本文件。

  40s --> Joe (opening the file, editing a line, saving, exiting)

   2s --> sed -n '15000000p;15000000q' file.txt
   3s --> sed -n '149p' file.txt
  10s --> sed '149s/File/Pile/' file.txt > file2.txt
3m15s --> sed -i '149s/File/Pile/' file.txt

   4s --> perl -ne 'if($.==15000000){print;exit}' file.txt
   8s --> perl -ne 'print if $.==149' file.txt
  19s --> perl -pe 's/File/Pile/ if $.==149' file.txt > file2.txt
  20s --> perl -i -pe 's/File/Pile/ if $.==149' file.txt

   4s --> awk -n 'NR==15000000{print;exit}' file.txt
   8s --> awk -n 'NR==149{print}' file.txt
  15s --> awk 'NR==149{gsub("File","Pile")}1' file.txt > file2.txt
 4m3s --> awk -i inplace 'NR==149{gsub("File","Pile")}1' file.txt
  • sed读取整个文件并显示一行的速度最快
  • sed执行替换并保存到其他文件的速度最快
  • perl执行替换并保存为相同文件名的速度最快

答案2

如果您可以通过用空格等填充来保持相同的大小,则可以使用dd提取部分,编辑它,确保其大小相同,然后将其写回。man dd有关详细信息(偏移量、块大小等),请参阅

如果无法保持相同的大小,则无论如何您都需要打开完整的文件,因为编辑后的所有内容都必须相应地移动。

您没有说文件有多大,但emacs可以处理大文件(或者换句话说,到目前为止,我需要编辑的所有真正大的文件都可以处理emacs)。

相关内容