由于工作中需要处理很大的数据文件,使用split命令将其切分成较小的文件后再进行处理是一个不错的选择。
在默认情况下,split以1000行为单位进行切分,如果不足1000行的会另外输出到一个文件。
输出文件由前缀和后缀组成,默认前缀为"x",默认后缀是从a开始带两个字符,如"aa"、"ab"等,当下一个生成的文件到达最后一个字符时,字符数量会加2,如:'yz', 'zaaa'...通过这种扩展方式,输出的文件数量没有限制。
但要注意:如果通过-a选项指定了后缀的长度,当后缀序列用完后split会报错,已经切分好的文件会保留。
我的split版本是8.22。支持的选项如下:
-l LINES 或者 --lines=LINES
将文件按 LINES 行切分到输出文件中。
-b SIZE 或者 --bytes=SIZE
将文件按指定的SIZE容量大小来切分到输出文件中
可以使用数值的形式或者单位的形式来表示
'MB' <==> 1000*1000
容量大小的相关含义:KB表示1000字节 K表示1024字节,其他容量单位类似。
切分后的文件中可能会存在不完整的行 到容量的分割点时,某一行可能还没有结束,会导致该行被切割成了两行或多行。
但不用担心数据不完整,将顺序相邻的文件合并后(比如使用cat将两个文件内容拼到一起),不完整的行又会合并成一行。
-C 或者 --line-bytes=SIZE
跟-b都是按SIZE容量大小来切割,不同的是会以接近设置的最大容量切割,而不是一定是设置的容量。当行的大小不超过设置的容量时,会保证文件中每行内容的完整性,每个文件的容量会近似设置的最大容量。
--filter=COMMAND
直接使用split也可以切分压缩文件,但是一般无法指定压缩文件的扩展名。
split -b200G test.xz big-
通过该选项,并结合FILE环境变量可以为每个切分后的压缩文件指定扩展名。
当有大的压缩文件要切分时,可以使用下面的命令
xz -dc BIG.xz | split -b200G --filter='xz > $FILE.xz' - big-
如果是1:10的压缩比,以上命令会将1T的文件切分成50个20G的文件,切分后的文件名类似:'big-aa.xz', 'big-ab.xz'
-n CHUNKS 或者 --number=CHUNKS
将文件切分成指定数量的文件,有3种模式:1、一般模式 2、l模式 3、r模式
块数(CHUNKS)的值可以设置为如下的形式:
N 以当前INPUT的大小切分成N个文件
K/N 仅将N个文件中的第K个输出到标准输出
l/N 切分成N个文件,同时保证行不会被切断
l/K/N 将N个文件中的第K个输出到标准输出,同时保证行不会被切断
r/N 类似l模式,但使用轮询分配
r/K/N 类似r/N,但仅将N个文件中的第K个输出到标准输出
(1)、一般模式下,将 INPUT 切分成 N 个块后剩余的字节,会分配给最后一个块。初始计算后input中再加入字节会被丢弃(除非使用r模式)。只要指定了N,即使INPUT少于N行或者INPUT中断,也始终会切分成N个文件。可能存在行被切断的情形。
(2)、在l模式下,块的大小约为INPUT大小/N,INPUT 会被分成 N 个相等大小的部分,最后分配剩余的。行不会被切断,最终的输出文件可能不会正好等于计算的切分大小;如果有的行非常长,有的块最终会是空的。
(3)、在r模式下,会将文件行按块数挨个分配给相应的块。INPUT可以是任意大小,可直接用管道。
-a LENGTH 或者 --suffix-length=LENGTH
指定文件后缀名长度
如果LENGTH为0,则跟默认设定一致,长度2,且在必要时会自动将长度加2。
-d 或者 --numeric-suffixes[=FROM]
将后缀设置为数字而不是默认的小写字母。
如果指定FROM,则从FROM开始计数,否则从0开始。
需要注意,指定 FROM 值会禁用默认的自动后缀长度扩展,如果后缀值超过了“99”,需要指定“-a”选项。
--additional-suffix=SUFFIX
输出文件名后附加一个额外的SUFFIX(后缀)。利用该选项可以生成文件的扩展名。
注意:SUFFIX不能包含斜线。
-e 或者 --elide-empty-files
当指定--number选项时,如果文件行数比切分后的块数少,或者有非常长的行跨越了一个块都会造成生成空的(0长度)输出文件。指定该选项后,切分时不会生成空文件,且输出文件序列号也还是连续顺序生成的。
-u 或者 --unbuffered
不使用缓冲,立即将输入复制到输出。在'--number r/...'模式下,不使用缓冲会慢很多。
--verbose
切分前输出诊断信息
--version
显示版本信息