点击上方"开发者的花花世界",选择"设为星标"技术干货不定时送达!
这是一个知识点
方便快捷的给结构化数据文件分割大小并保留文件的表头,几十个G的结构化文件不仅阅读编辑麻烦,而且使用受限,因此高效的分割成小文件并保留头行
1、分割文件
在Linux下,切割和合并文件可以使用split和cat命令来实现。在Windows下,安装Git Bash也可以使用split和cat命令。分割文件的命令是split,通过输入split --help可以查询帮助信息。假设现在有个6GB大小的文件test.log,这里简单介绍下几种分割的方式:
按大小分割文件(此处不推荐)
split -b 500m 文件 newfile
每个文件大小500m,生成的新文件的文件名是newfile后面加上按照aa,ab,ac……来排序的 比如文件有1.4G,那么会切割出3个文件,文件名分别是newfileaa,newfileab,newfileac,没有扩展名 新文件名可以不设置,系统默认新文件以字母x开头,也就是说,如果命令是:
split -b 500m log.txt
那么文件名就是xaa,xab,axc 速度比windows下的那些什么切割软件快太多 同时,-C参数表示按照所有行数加起来的最大字节数进行分割,同样可以使用k或者m作为单位,其实效果和上边的-b差不多,只是在切割时将尽量维持每行的完整性。另外切开的文件还能再合起来,命令是:
cat newfile* > orifile
此处不推荐的原因是因为结构化文件按大小分割会造成结构破坏,故推荐按行分割
按行分割文件
split -l
split -l 5000 文件 newfile
-l参数表示按照行数进行分割,即一个小文件中最多有多少行,-l number可以缩写成-number,上边的命令表示按照5000行一个小文件进行分割。
推荐按行分割文件,能保留行的完整性不破坏结构化文件的结构
2、给分割后的文件插入表头行
Sed是一款流编辑工具,用来对文本进行过滤与替换操作,特别是当你想要对几十个配置文件做统一修改时,你会感受到Sed的魅力!Sed通过一次仅读取一行内容来对某些指令进行处理后输出,所以Sed更适合于处理大数据文件。首先,Sed通过文件或管道读取文件内容,但Sed默认并不直接修改源文件,而是将读入的内容复制到缓冲区中,我们称之为模式空间(pattern space),所有的指令操作都是在模式空间中进行的,然后Sed根据相应的指令对模式空间中的内容进行处理并输出结果,默认输出至标准输出(即屏幕上)。
Sed从文件中读取数据,如果没有输入文件,则默认对标准输入进程数据进行处理,脚本指令是第一个非“-”开头的参数,具体语法格式如下:
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 | 最低限度的缓存输入和输出 |
因此,给分割后的文件加表头的方法是:
sed -i "1i 字段,字段,字段,字段" 文件
1i表示第一行之前
3、批量给分割后的文件增加后缀名
由于分割后的文件默认是没有后缀名的,故需要增加后缀名 非常简单,例如CSV后缀
for i in *do mv $i $i".csv"done
完成
关注Github:1/2极客[1]
关注博客:御前提笔小书童[2]
关注网站:HuMingfeng[3]
关注公众号:开发者的花花世界
References
[1]
1/2极客: https://github.com/humingfeng[2]
御前提笔小书童: https://blog.csdn.net/qq_22260641[3]
HuMingfeng: https://royalscholar.cn
喜欢就点个"在看"呗^_^