有一个1.5亿行的文件data,每一行都是固定的几列:
userid columnA columnB columnC
不同行的userid可能一样。
现在有个需求,需要把这个文件里面的每一行按照userid划分到不同的文件,如有一行的内容是:
123 A B C
则需要将这一行写入文件data_123里面。
最开始的方法比较暴力,如下:
while read line;do
userid=`cat ${line} | awk '{print $1}'`
echo ${line} >> data_${userid}
done<data
这个方法执行了一下,发现半天还没结束。后来计算了一下,大概一秒才处理600行,1.5亿行大概得处理70个小时。。。
果断换个方案。后来在Linux命令大全上看了一下awk命令的说明,改成下面实现方案:
# 先划分成小文件,一个文件200w行
split -d -a3 -l2000000 data d_
for file in d_*;do
awk '{print $0 >> "data_"$1}' ${file}
done
重新跑了一下,大概40分钟跑完了,速度提高100来倍。虽然还是很慢,但是对于shell菜鸟的我,已经很满足了哈哈~~