我想使用终端/ shell来截断或以其他方式将文本文件限制为一定数量的行。
我有一个完整的文本文件目录,每个目录只有前50k行才有用。
如何删除超过50000的所有行?
答案 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更有点打字。 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行。