《这是知识点》之Linux下分割文件并保留文件头

《这是知识点》之Linux下分割文件并保留文件头

这是一个知识点

方便快捷的给结构化数据文件分割大小并保留文件的表头,几十个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
2
3
4
5
for i in *

do mv $i $i".csv"

done

完成


关注Github:1/2极客

关注博客:御前提笔小书童

关注网站:HuMingfeng

关注公众号:开发者的花花世界


本作品采用知识共享署名 4.0 中国大陆许可协议进行许可,欢迎转载,但转载请注明来自御前提笔小书童,并保持转载后文章内容的完整。本人保留所有版权相关权利。

本文链接:https://royalscholar.cn/2020/03/25/《这是知识点》之Linux下分割文件并保留文件头/

# IDEA

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×