當對一個大文件進行傳輸或者分析的時候,一個能夠參考的辦法是先經過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