这是一个知识点
方便快捷的给结构化数据文件分割大小并保留文件的表头,几十个G的结构化文件不仅阅读编辑麻烦,而且使用受限,因此高效的分割成小文件并保留头行
1、分割文件
在Linux下,切割和合并文件可以使用split和cat命令来实现。
在Windows下,安装Git Bash也可以使用split和cat命令。
分割文件的命令是split,通过输入split –help可以查询帮助信息。假设现在有个6GB大小的文件test.log,这里简单介绍下几种分割的方式:
按大小分割文件(此处不推荐)
1 | split -b 500m 文件 newfile |
每个文件大小500m,生成的新文件的文件名是newfile后面加上按照aa,ab,ac……来排序的
比如文件有1.4G,那么会切割出3个文件,文件名分别是newfileaa,newfileab,newfileac,没有扩展名
新文件名可以不设置,系统默认新文件以字母x开头,也就是说,如果命令是:
1 | split -b 500m log.txt |
那么文件名就是xaa,xab,axc
速度比windows下的那些什么切割软件快太多
同时,-C参数表示按照所有行数加起来的最大字节数进行分割,同样可以使用k或者m作为单位,其实效果和上边的-b差不多,只是在切割时将尽量维持每行的完整性。
另外切开的文件还能再合起来,命令是:
1 | cat newfile* > orifile |
此处不推荐的原因是因为结构化文件按大小分割会造成结构破坏,故推荐按行分割
按行分割文件
split -l <行数> <目标文件> <切割后的文件前缀>
1 | split -l 5000 文件 newfile |
-l参数表示按照行数进行分割,即一个小文件中最多有多少行,-l number可以缩写成-number,上边的命令表示按照5000行一个小文件进行分割。
推荐按行分割文件,能保留行的完整性不破坏结构化文件的结构
2、给分割后的文件插入表头行
Sed是一款流编辑工具,用来对文本进行过滤与替换操作,特别是当你想要对几十个配置文件做统一修改时,你会感受到Sed的魅力!Sed通过一次仅读取一行内容来对某些指令进行处理后输出,所以Sed更适合于处理大数据文件。首先,Sed通过文件或管道读取文件内容,但Sed默认并不直接修改源文件,而是将读入的内容复制到缓冲区中,我们称之为模式空间(pattern space),所有的指令操作都是在模式空间中进行的,然后Sed根据相应的指令对模式空间中的内容进行处理并输出结果,默认输出至标准输出(即屏幕上)。
Sed从文件中读取数据,如果没有输入文件,则默认对标准输入进程数据进行处理,脚本指令是第一个非“-”开头的参数,具体语法格式如下:
1 | sed [选项]...{脚本指令} [输入文件] |
选项 | 含义 |
---|---|
–version | 显示sed版本 |
–help | 显示帮助文档 |
-n,–quit,–silent | 静默输出,默认情况下,sed程序在所有的脚本指令执行完毕后,将自动打印模式空间中的内容,该选项可以屏蔽自动打印。 |
-e script | 允许多个脚本指令被执行 |
-f script-file | 从文件中读取脚本指令,对编写自动脚本程序很实用。 |
-i,–in-place | 慎用,该选项将直接修改源文件 |
l,N | 该选项指令l指令可以输出的行长度,l指令为输出非打印字符。 |
–posix | 禁用GNU sed扩展功能 |
-r | 在脚本指令中使用扩展正则表达式 |
-s,–separate | 默认情况下,sed将把输入的多个文件名作为一个长的连续的输入流,而GNU sed则允许把它们当作单独的文件 |
-u,–unbuffered | 最低限度的缓存输入和输出 |
因此,给分割后的文件加表头的方法是:
1 | sed -i "1i 字段,字段,字段,字段" 文件 |
1i表示第一行之前
3、批量给分割后的文件增加后缀名
由于分割后的文件默认是没有后缀名的,故需要增加后缀名
非常简单,例如CSV后缀
1 | for i in * |
完成
关注Github:1/2极客
关注博客:御前提笔小书童
关注网站:HuMingfeng
关注公众号:开发者的花花世界
本作品采用知识共享署名 4.0 中国大陆许可协议进行许可,欢迎转载,但转载请注明来自御前提笔小书童,并保持转载后文章内容的完整。本人保留所有版权相关权利。
本文链接:https://royalscholar.cn/2020/03/25/《这是知识点》之Linux下分割文件并保留文件头/