一、简介

在Linux中合并文件可以使用cat命令,后面跟上要合并的文件然后重定向到一个新的文件中即可,甚至可以追加合并。但如果要将一个大文件分割为多个小文件应该如何操作呢?

在Linux的coreutils中有一个工具split实现了这个功能,可以把一个大文件切割为多个小文件,甚至可以借助管道将流切成固定大小的文件,切割规则可以使用行数,也可以使用字节数。

二、预备测试数据

先生成一个稍微大点的文件,接下来就切割这个文件:

#! /bin/bash

for((i=0;i<1000000;i++));
do
echo $i >> data
done

将上面这段保存为gen-data.sh,然后执行生成一个名为data有1000000行的文本文件。

三、按行数分割

将data按照每10000行为一个文件切割:

对于切割后的小文件的命名,名称由“前缀”+“后缀”的形式组成,所有的小文件拥有相同的前缀,前缀是为了将它们归为一类,默认的前缀为x,后缀是一个自增的序列,即给每个小文件编号,默认从aa开始递增编号。

自定义前缀和后缀,-d表示使用数字后缀:

上面的自增好像有点bug,因为默认的后缀长度为2而生成的文件数位数超出了2,所以后面的部分计数看起来就有点奇怪,可以指定后缀长度修正它:

现在编号没有问题了。

四、按字节分割

还可以对文件按照字节数进行分割,一般用于二进制文件,这里为了方便直接拿data文件做分割了:

五、从标准输入读入

一般说的从标准输入读取实际的应用场景一般都是从管道中读入,所以可以假设一个场景,有一个程序随机的输出一些信息到标准输出, 现在想每100000行存为一个文件方便后续操作,如何做比较方便呢?

一般情况下可能会使用一些脚本语言做这个每n行切换一个文件的操作,但这种屁大点事就要引入一个python或ruby之类的真是浪费,使用split一行就可以搞定。

将前面的gen-data.sh复制为gen-data-to-stdout.sh改为直接输出到标准输出:

#! /bin/bash

while true
do
echo $i
done

现在有了一个会不断输出信息的程序,接下来使用split实现每n行输出一个新文件的功能:

./gen-data-to-stdout.sh | split -l 100000 -d -a 10 - foo-stdout-

然后查看当前文件夹下的输出:

上面是一个对管道流按照行数分割的例子,接下来看一个对管道流按照字节数分割的例子,对tar打包后的文件按照2g为单位进行分割:

tar zcvf - foo-stdout-* | split -b 2G -d -a 3 - foo-stdout.tar.gz.

六、思考:为什么分割为的小文件需要前缀呢?

默认情况下分割后的小文件放在当前文件夹下,不会自动创建新的文件夹来存放它们(想一想创建文件夹的目的是什么呢),前缀的目的就是为了提供一种方式能够方便的找到分割后的小文件以对其进行批量操作,比如对data文件进行分割操作,分割为了data-part-000、data-part-001、data-part-002、data-part-003 ...等一千个小文件,那么可以使用前缀data-part-*对这一千个小文件进行批量操作,即使当前目录下还有完全无关的千八百个其它文件也对这个操作不影响,只要前缀不冲突就行。如果没有前缀的话分割后的这一千个小文件就跟其它的文件混在一起了,要批量操作它们很困难。

总结:对分割为的小文件加相同的前缀是为了方便找到它们,实际上可以将前缀看做是一个组名称,使用组前缀将这些小文件打成一组。

七、总结

使用split可以将一个大文件分割为多个小文件,分割方式可以使用字节或行数,也可以从管道中读入数据流对数据流按照行数或字节数分割。

.

Linux笔记之如何分割文件或管道流:split的更多相关文章

  1. Linux笔记(十一) - 文件系统管理

    (1)文件系统查看命令:df [选项] [挂载点]-a 显示所有文件系统信息,包括特殊文件系统,如/proc /sysfs-h 使用习惯单位显示容量,如KB,MB或GB-T 显示文件系统类型-m 以M ...

  2. linux笔记二-----目录及文件命令

    一:目录及文件操作 1.file:识别文件类型 如果是文本文件,会显示ASCII: 如果是执行会显示shell script: 如果链接文件显示链接执行文件等信息 2.touch:改变文件或目录时间. ...

  3. linux笔记_20150417_ubuntu 常见问题_文件_音乐播放器

    最近在学习ubuntu的过程中,遇到了一些问题,就记下来了它的解决办法.以希望对你也有用. ),至少保证周围局域网内用户可以访问.至于配置文件,内容比较少,反正对我来讲能用就ok了~不知道会不会很弱 ...

  4. Linux笔记(三) - 文件搜素

    (1)文件搜索:find-name  根据文件名, *匹配任意字符 ,?单个字符-iname  根据文件名, 不区分大小写-size 根据文件大小查找 (+ 大于 -小于)(-a并且 -o或者)-us ...

  5. Linux笔记:定时任务和文件操作

    查看定时任务 crontab -l 注册定时任务 crontab -e然后就像 vim 一样编辑自己的定时任务.如: * * * * * . /home/hadoop/timer/check_job. ...

  6. split 分割文件

    1.命令功能 split将文件分割成多个碎片文件. 2.语法格式 split  option  input  prefix split  选项    输入文件名   输出文件名前缀 参数说明 参数 参 ...

  7. Java NIO 学习笔记(五)----路径、文件和管道 Path/Files/Pipe

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  8. 《Linux程序设计》--读书笔记---第十三章进程间通信:管道

    管道:进程可以通过它交换更有用的数据. 我们通常是把一个进程的输出通过管道连接到另一个进程的输入: 对shell命令来说,命令的连接是通过管道字符来完成的: cmd1    |     cmd2 sh ...

  9. Linux学习笔记(二)——文件/目录/VIM

    文件和目录管理 及 VI编辑器的使用 文件和目录管理,刚开始学这块的时候感觉内容很多很杂,但是学完进行总结后,发现其实很有条理的而且没什么难度,只是熟练掌握这些常用的命令就行了.至于Vim编辑器,不得 ...

随机推荐

  1. 《Bandwidth-Aware Scheduling With SDN in Hadoop:A New Trend for Big Data》--2017

    Hadoop中使用SDN的带宽感知调度:大数据的一种新趋势 Abstract: 为了处理大规模的数据,提出了基于Hadoop框架的MapReduce,在Hadoop系统中,有一种叫做NP完全最小(NP ...

  2. Unbuntu18.04通过apt源方式安装mysql5.7.22

    Ubuntu18.04在今年4月底发布了,喜欢尝鲜的小伙伴肯定是第一时间就更新了系统版本,那么在Ubuntu18.04中怎么安装msyql5.7(mysql8.0因为新出,再观望一段时间)呢? * 带 ...

  3. 深入理解Java反射+动态代理

    答:   反射机制的定义: 是在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的功能称为j ...

  4. 深入理解ajax系列第七篇——传递JSON

    前面的话 虽然ajax全称是asynchronous javascript and XML.但目前使用ajax技术时,传递JSON已经成为事实上的标准.因为相较于XML而言,JSON简单且方便.本文将 ...

  5. MT【182】系数奇怪的二次函数

    设函数$f(x)=3ax^2-2(a+b)x+b,$其中$a>0,b\in R$证明:当$0\le x\le 1$时,$|f(x)|\le \max\{f(0),f(1)\}$ 分析:由$a&g ...

  6. 浅谈范德蒙德(Vandermonde)方阵的逆矩阵的求法以及快速傅里叶变换(FFT)中IDFT的原理

    浅谈范德蒙德(Vandermonde)方阵的逆矩阵与拉格朗日(Lagrange)插值的关系以及快速傅里叶变换(FFT)中IDFT的原理 标签: 行列式 矩阵 线性代数 FFT 拉格朗日插值 只要稍微看 ...

  7. 【字符串算法2】浅谈Manacher算法

    [字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述  字符串算法2:Manacher算法 问题:给出字符串S(限制见后)求出最 ...

  8. 安装完打开 eclipse 提示 JVM 版本较低

    在安装完 eclipse 后打开出现如下提示 解决办法: 1> 去官网下载最新版本安装 地址 2> linux 下直接下载安装 1.打开终端 2.控制台输入:su 3.控制台输入个人密码 ...

  9. 【转】crc16几种标准校验算法及c语言代码

    一.CRC16校验码的使用 现选择最常用的CRC-16校验,说明它的使用方法. 根据Modbus协议,常规485通讯的信息发送形式如下: 地址 功能码 数据信息 校验码 1byte 1byte nby ...

  10. raft 论文

    raft 论文,摘自  http://www.infoq.com/cn/articles/raft-paper raft动画:https://raft.github.io/ raft说明动画: