linux split 按文件大小整行分割文本文件
在网上搜了一段时间,没搜到有专门写,如何把文件按大小分割,但切出来的文件每行是完整的(可能是我运行不好吧)。后来查了split --help 发现了如下方法。经过测试好用。
比如把50G文件分割成50个小文件,每个文件1G,如果按 -b 参数分割,有很多文件第一行和最后一行不是完整的,残缺不全。
笔者部份工作是hadoop数据入关系数据库工作,有时为了效率需要把大文件切成小文件,多线程入库。
直接上干货代码与测试结果。
案例一:
hdfs 上 /tmp/wjy/目录有35G gp压缩过的文件。使用 dfs -text 将/tmp/wjy/20210416/ 进行解压,写入到当前目录,将35G文件分割成274个文件(每个大约是128M). 可写个shell脚本,用命令取到 /tmp/wjy/20210416/目录总大小,再将 目录总大小/128M=要分割的文件数。
[jingyu.wang@hadoop test2]$ time hdfs dfs -text /tmp/wjy/20210416/* | split -n r/274
real 4m38.103s
user 4m28.147s
sys 3m8.376s
案例二:
直接将硬盘上的35G文件partsupp.tbl 拆分成274个文件。注意以下方式是不支持流式分割文件。只能把硬盘上指定文件进行分割。
[jingyu.wang@hadoop test1]$ time split -n l/274 ../partsupp.tbl
real 1m22.209s
user 0m0.137s
sys 0m36.444s
案例三:
将硬盘上test.gz 文件解压后切割成274个文件。这个案例我没测试过,理论上是可行的。
[jingyu.wang@hadoop test1]$ gunzip -c /root/test.gz | split -n r/274