有一个 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 菜鸟的我,已经很满足了哈哈~~
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于