CSV文件列数处理性能优化:13万行数据列数补全提速方案
处理大CSV文件:从龟速到飞一般的优化方案
哈哈,处理13万行的CSV文件时,用while read逐行循环慢到离谱太正常了——我之前碰过类似的场景,那种看着进度条龟速爬的感觉真的让人抓狂!
为什么原来的方法这么慢?
你最开始用的这段代码:
while read line; do nr_columns=$(echo $line | awk -F'|' '{print NF}') echo $line>> out done < input_file.csv
问题出在每行都要启动两个子进程:echo和awk。13万行的话,就是26万次进程创建与销毁,系统光是在进程切换上就耗掉了大部分时间,运行时间从10秒涨到3分钟完全不意外,哪怕换成tr也一样逃不过频繁子进程的开销。
最快的解决方案:用awk全程处理
你最终采用的awk方案才是正确的打开方式!awk本身就是为处理文本流设计的,全程单进程运行,没有额外的进程切换开销,处理大文件效率拉满。
再把你的代码整理得更清晰些:
awk -v separator="|" -v nr_fields=17 -F"|" '{ if (NF < nr_fields) print $0 separator 0; else print $0 }' input_file.csv > outputfile
简单拆解下逻辑:
- 用
-v把分隔符(这里是|)和目标列数(17)传递给awk变量 -F"|"指定字段分隔符为|- 遍历每一行,判断当前列数
NF是否小于目标列数:- 如果是,就输出原行内容+分隔符+
0补全 - 如果不是,直接输出原行
- 如果是,就输出原行内容+分隔符+
这种写法全程在awk内部完成所有逻辑,不需要调用任何外部命令,处理13万行数据基本就是秒级的事儿。
内容的提问来源于stack exchange,提问作者FlorentinaP
相关产品推荐
相关产品推荐

