gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:47:05 28 4
gpt4 key购买 nike

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

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

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

最佳答案

就地截断

要使用 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 重定向到新文件即可:

head -n50000 oldfilename > newfilename
  • -n50000表示行数,head否则默认为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。它是带有 maxlen=0deque 上的绑定(bind) extend 方法,这是在 Python 中耗尽迭代器的最快方法(我是这样的)意识到)。

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

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

>>> truncate('filename', 50000)

关于shell - 如何按行数限制(或截断)文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19017994/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com