如何使用 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
我有非常大的文件 (> 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