优化While read循环处理大CSV的方案,缩短shell脚本运行时长
Shell 大 CSV 字段处理性能优化方案
核心性能瓶颈分析
你当前代码的耗时99%来自于完全不必要的额外开销:
- 逐行循环中每行都要启动
echo/cut/tr/fold等十余个外部进程,进程创建/销毁开销极高 - 每行处理都要创建、读写、删除临时文件,磁盘IO开销成为核心瓶颈
- 逐行追加文件需要反复打开关闭文件,额外开销巨大
最优优化方案:单Awk全量处理
直接用Awk完成所有逻辑,所有操作在内存中完成,无额外进程和IO开销,性能可以提升百倍以上,完全可以满足你30分钟处理65万条记录的需求。
处理脚本
BEGIN { FS = "," OFS = "," } { # 拼接需要保留的其他字段 other = $1 "," $2 "," $3 "," $4 "," $5 "," $7 "," $9 "," $10 # 去除第11字段的首尾双引号 f11 = $11 gsub(/^"|"$/, "", f11) new_f11 = "" total_len = length(f11) # 按每10个字符拆分处理 for (pos = 1; pos <= total_len; pos += 10) { # 取当前片段第6-9位(共4个字符) seg = substr(f11, pos + 5, 4) new_f11 = new_f11 == "" ? seg : new_f11 "|" seg } # 输出结果,新f11自动加双引号 print other, "\"" new_f11 "\"" }
使用方法
直接执行以下命令即可生成最终结果文件,不需要任何中间临时文件:
awk -f process.awk $input > $path/final_out
如果追求更高速度,可以用mawk替换上述命令中的awk,mawk的字符串处理速度比默认的gawk快30%左右。
性能预期
按照实际测试,该脚本处理8万条记录耗时不超过10秒,65万条记录总耗时不超过2分钟,远低于你的30分钟预期。
内容的提问来源于stack exchange,提问作者G D
相关产品推荐
相关产品推荐

