如何使用 linux 命令删除大文件 (>5G) 的某些行

How to remove certain lines of a large file (>5G) using linux commands

我有非常大的文件 (> 5G),我想按行号 删除一些行而不移动(复制和粘贴)文件.

我知道这个命令适用于小文件。 (我的 sed 命令不识别 -i 选项)

sed "${line}d" file.txt > file.tmp && mv file.tmp file.txt

由于文件大小,此命令需要较长时间。我只需要删除第一行和最后一行,但还想知道如何删除第n行,例如。

由于文件存储在标准文件系统(NTFS、EXTFS 等)上的方式,您无法就地删除文件的一部分。

您唯一可以就地做的是

  • 追加到文件末尾(追加模式)
  • 修改文件中的数据(读写模式)

其他操作必须使用临时文件,或临时内存来完整读取文件并修改后写回。

编辑:您还可以使用 C 程序 "shrink" 读取 here 文件(Linux 或 Windows 可以),这意味着您可以删除最后一行(但仍然不是第一行或中间的任何一行)

如果您使用的是最近的 Linux,您可以删除任何位置的文件块:https://lwn.net/Articles/415889/

有一个命令可以删除文件的任何部分:fallocate

参见:https://manpages.ubuntu.com/manpages/xenial/man1/fallocate.1.html

例如:fallocate -p -o 10G -l 1G qqq

您可以使用与 sed 非常相似的 ed 命令

ed -s file.text

可以使用d命令,$d删除最后一行,1d删除第一行,wq写入退出。

以下命令将完成所有操作(删除第一行和最后一行,写入并退出)

echo -e '1d\n$d\nwq' | ed -s test.txt

使用 sed 您可以使用相同的命令 sed '1d;$d' test.txt