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

时间:2013-09-26 01:44:54

标签: shell unix sed text-files head

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

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

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

2 个答案:

答案 0 :(得分:57)

就地截断

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

sed -i '50001,$ d' filename
  • -i意味着到位。
  • d表示删除。
  • 50001,$表示从50001到结尾的行。

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

sed -i.backup '50001,$ d' filename

OS-X or FreeBSD中,您必须向-i提供参数 - 这样做是为了避免进行备份:

sed -i '' '50001,$ d' filename

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

sed --in-place '50001,$ d' filename
sed --in-place=.backup '50001,$ d' filename

新文件

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

head -n50000 oldfilename > newfilename
  • -n50000表示行数,否则默认为10。
  • >表示重定向,覆盖可能存在的任何其他内容。
  • 如果您要附加到新文件中,请将>>替换为>

不幸的是,您无法重定向到同一个文件,这就是为什么推荐使用sed进行就地截断的原因。

没有sed?试试Python!

这比sed更有点打字。 Sed是" Stream Editor"毕竟,这是使用它的另一个原因,它是该工具的适用范围。

这是在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())

解释Python:

黑洞就像/dev/null一样。它是带有extend的{​​{1}}上的绑定deque方法,这是在Python中耗尽迭代器的最快方法(我很清楚)。

我们无法简单地循环遍历文件对象,因为maxlen=0方法会被阻止,因此我们需要tell技巧。

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

iter(f.readline, '')

答案 1 :(得分:3)

确实很容易使用sed:

sed -n '1,50000 p' filename

这只会在'filename'文件中打印1到50000行。