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更有点打字.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.它extend是dequewith 上的绑定方法maxlen=0,这是在Python中耗尽迭代器的最快方法(我知道).
我们不能简单地循环遍历文件对象,因为该tell方法将被阻止,所以我们需要这个iter(f.readline, '')技巧.
此函数演示了上下文管理器,但由于Python在退出函数时关闭文件,因此它有点多余.用法很简单:
>>> truncate('filename', 50000)
Run Code Online (Sandbox Code Playgroud)
使用 sed 确实很容易:
sed -n '1,50000 p' filename
Run Code Online (Sandbox Code Playgroud)
这只会在文件“filename”中打印第 1 到 50000 行。