当对一个大文件进行传输或者分析的时候,一个可以参考的办法是先通过split对文件进行分割,再对每个子文件进行处理,如果需要合并再进行合并。
split函数可以按文件大小或者行数来进行分割。
-a : 指定后缀长度
-b : 每个文件多少字节,单位可以为k和M
-d : 使用数字后缀而不是字母
-l : 指定每个文件的行数,默认1000
例子:
切割一个文件为每个子文件20M大小,-b指定20M大小,filename为文件名,prefix为每个子文件的前缀。后缀通常为aa,ab,ac...。
$ split -b 20m filename prefix
prefixaa
prefixab
prefixac
prefixad
...
修改为后缀长度为 2,即 -a 2。用数字后缀 -d。每个文件 10M,即 -b 10m。
$ split -a -d -b 10m access.log haha
haha00
haha01
haha02
haha03
...
面试题:两个大文件,文件内容如下,需要找出两个文件中相同的数据。
#文件a #文件b
当然可以通过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