split分割大文件--包含经过awk按规则分割文件到对应子文件

当对一个大文件进行传输或者分析的时候,一个能够参考的办法是先经过split对文件进行分割,再对每一个子文件进行处理,若是须要合并再进行合并。面试

split函数能够按文件大小或者行数来进行分割。函数

  • -a : 指定后缀长度spa

  • -b : 每一个文件多少字节,单位能够为k和Mcode

  • -d : 使用数字后缀而不是字母blog

  • -l : 指定每一个文件的行数,默认1000it

例子:class

切割一个文件为每一个子文件20M大小,-b指定20M大小,filename为文件名,prefix为每一个子文件的前缀。后缀一般为aa,ab,ac...。awk

$ split  -b  20m  filename  prefix
prefixaa
prefixab
prefixac
prefixad
...

修改成后缀长度为 2,即 -a 2。用数字后缀 -d。每一个文件 10M,即 -b 10m。file

$ split -a 2 -d -b 10m access.log haha
haha00
haha01
haha02
haha03
...

 

面试题:两个大文件,文件内容以下,须要找出两个文件中相同的数据。数据

#文件a
111
222
333
444

#文件b
444
555
666
222

固然能够经过cat a b | sort | uniq -d查找,若是文件太大的话,须要先对文件拆分再进行查找,通常就是先用split把文件a和文件b分别拆分为好比10个文件,可是比较这些子文件的话是很麻烦的,由于a文件的每一个子文件都要和b文件的每一个子文件作一遍比较,就是要比较100次,那么能不能只经过比较10次就能得出结果呢?

答案就是在拆分时把每行按照必定的规则放到同一个后缀的子文件下,好比这里咱们经过取余的方式来分,111 % 10为1,而后就放到子文件a_1中,那么若是b中有111这行数据的话,确定也是放在子文件b_1中,这样只要比较a和b的对应子文件就能够了,10次比较就搞定了。

先用awk分出10个子文件,而后再比较就能够了。

awk '{mod = $0 % 10}{print >> "a_"mod}{close("a_"mod)}' a
awk '{mod = $0 % 10}{print >> "b_"mod}{close("b_"mod)}' b
相关文章
相关标签/搜索