有一個1.5億行的文件data我碟,每一行都是固定的幾列:
userid columnA columnB columnC
不同行的userid可能一樣。
現(xiàn)在有個需求肥隆,需要把這個文件里面的每一行按照userid劃分到不同的文件站绪,如有一行的內(nèi)容是:
123 A B C
則需要將這一行寫入文件data_123里面。
最開始的方法比較暴力遂鹊,如下:
while read line;do
userid=`cat ${line} | awk '{print $1}'`
echo ${line} >> data_${userid}
done<data
這個方法執(zhí)行了一下振乏,發(fā)現(xiàn)半天還沒結(jié)束。后來計算了一下秉扑,大概一秒才處理600行慧邮,1.5億行大概得處理70個小時调限。。误澳。
果斷換個方案。后來在Linux命令大全上看了一下awk命令的說明,改成下面實現(xiàn)方案:
# 先劃分成小文件,一個文件200w行
split -d -a3 -l2000000 data d_
for file in d_*;do
awk '{print $0 >> "data_"$1}' ${file}
done
重新跑了一下郑叠,大概40分鐘跑完了秋泳,速度提高100來倍。雖然還是很慢倡缠,但是對于shell菜鳥的我哨免,已經(jīng)很滿足了哈哈~~