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

Posted

技术标签:

【中文标题】如何按行数限制(或截断)文本文件?【英文标题】:How do I limit (or truncate) text file by number of lines? 【发布时间】:2013-10-01 19:36:17 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

使用 sed 确实很容易:

sed -n '1,50000 p' filename

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

【讨论】:

如果文本是 trucate,我想在最后一行之后使用省略号。我得到了yes | head -n 30 | nl | sed -ne '1,20 p' -e '21 i...' 这应该是 80 票接受的答案。所以总会给我惊喜。【参考方案2】:

就地截断

要使用 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 表示行数,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())

解释Python:

黑洞的工作方式类似于/dev/null。这是dequemaxlen=0 上的绑定extend 方法,这是在Python 中耗尽迭代器的最快方法(我知道)。

我们不能简单地遍历文件对象,因为tell 方法会被阻塞,所以我们需要iter(f.readline, '') 技巧。

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

>>> truncate('filename', 50000)

【讨论】:

只保留最后 50000 行怎么样? 如何在目录中递归地进行截断 @danielrvt find-exec sed... 应该允许您这样做:gnu.org/software/findutils/manual/html_mono/…

以上是关于如何按行数限制(或截断)文本文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React/CSS 或 Material UI 中按行高的倍数截断文本? [复制]

sh 将大文件拆分为小文本文件(按行数)

如何防止`UILabel`的文本顶部根据行数或截断而改变?

iphone UitextView 文本被截断

Windows 8.1 应用程序:使用换行、最大行数或最大高度识别 TextBlock 的 UI 文本截断

如何截断Angular2中的文本?