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