如何按行数限制(或截断)文本文件?

sjm*_*phy 26 unix shell sed head text-files

我想使用终端/ shell来截断或以其他方式将文本文件限制为一定数量的行.

我有一个完整的文本文件目录,每个目录只有前50k行才有用.

如何删除超过50000的所有行?

Aar*_*all 62

就地截断

要使用sed就地截断文件,可以执行以下操作:

sed -i '50001,$ d' filename
Run Code Online (Sandbox Code Playgroud)
  • -i 意味着到位.
  • d 意味着删除.
  • 50001,$ 表示从50001到结尾的行.

您可以通过添加扩展参数来备份文件-i,例如,.backup.bak:

sed -i.backup '50001,$ d' filename
Run Code Online (Sandbox Code Playgroud)

OS-X或FreeBSD中,你必须提供一个参数-i- 所以要做到这一点,同时避免进行备份:

sed -i '' '50001,$ d' filename
Run Code Online (Sandbox Code Playgroud)

长参数名称版本如下,有和没有备份参数:

sed --in-place '50001,$ d' filename
sed --in-place=.backup '50001,$ d' filename
Run Code Online (Sandbox Code Playgroud)

新文件

要创建新的截断文件,只需从头重定向到新文件:

head -n50000 oldfilename > newfilename
Run Code Online (Sandbox Code Playgroud)
  • -n50000 表示行数,head否则默认为10.
  • > 意味着重定向,覆盖可能存在的任何其他内容.
  • 替代>>>,如果你的意思是要追加到新文件.

遗憾的是,您无法重定向到同一个文件,这就是为什么建议将sed用于就地截断的原因.

没有sed?试试Python!

这比sed更有点打字.Sed毕竟是"流编辑器"的缩写,这是使用它的另一个原因,它是该工具适合的.

这是在Linux和Windows上使用Python 3测试的:

from collections import deque
from itertools import islice

def truncate(filename, lines):
    with open(filename, 'r+') as f:
        blackhole = deque((),0).extend
        file_iterator = iter(f.readline, '')
        blackhole(islice(file_iterator, lines))
        f.truncate(f.tell())
Run Code Online (Sandbox Code Playgroud)

解释Python:

黑洞的作用就像/dev/null.它extenddequewith 上的绑定方法maxlen=0,这是在Python中耗尽迭代器的最快方法(我知道).

我们不能简单地循环遍历文件对象,因为该tell方法将被阻止,所以我们需要这个iter(f.readline, '')技巧.

此函数演示了上下文管理器,但由于Python在退出函数时关闭文件,因此它有点多余.用法很简单:

>>> truncate('filename', 50000)
Run Code Online (Sandbox Code Playgroud)

  • 只保留最后 50000 行怎么样? (4认同)

tdk*_*2fe 9

使用 sed 确实很容易:

sed -n '1,50000 p' filename
Run Code Online (Sandbox Code Playgroud)

这只会在文件“filename”中打印第 1 到 50000 行。