Bash如何高效查找含LG标记的文本行并改写,解决逐行读取速度过慢问题
性能问题核心原因
你原有脚本性能差的核心原因是逐行循环时,每处理一条匹配行就要启动echo、awk、sed三个独立子进程,300万行的场景下进程创建销毁的开销占了绝大多数运行时间,完全不需要额外做行号查找再替换的操作,直接用单进程的文本处理工具就能把速度提升几十到上百倍。
最优解决方案
直接用单个awk命令处理全文件即可,300万行通常10秒内就能跑完。
方案1:对齐原有逻辑(LG固定在第8个字段)
和你现有脚本的处理逻辑完全一致,默认LG编号是行内按空白分割的第8个字段:
awk '/LG/{ $1 = $8; sub(/^/, ">") } 1' kopia_pliku_docelowego > nowy.txt
命令说明:
/LG/筛选所有包含LG的行- 把第一个字段替换为第8个字段,在行首补
> - 末尾的
1代表所有行直接输出
方案2:通用兼容方案(LG位置不固定)
如果LG编号的字段位置可能变化,用正则匹配提取LG+数字的组合,更稳妥:
awk '/LG[0-9]+/{ match($0, /LG[0-9]+/); lg_val = substr($0, RSTART, RLENGTH); $1 = lg_val ","; sub(/^/, ">"); } 1' kopia_pliku_docelowego > nowy.txt
轻量极速方案(sed实现)
如果追求极致的运行速度,用sed处理开销比awk更低:
sed -E '/LG[0-9]+/ s/^>([^ ]+)(.*LG([0-9]+))/>LG\3,\2/' kopia_pliku_docelowego > nowy.txt
额外提示
如果你需要原位修改原文件,awk方案可以加-i inplace参数(GNU awk支持),sed方案可以加-i参数直接修改原文件,不需要额外重定向输出。
内容的提问来源于stack exchange,提问作者antekkalafior
相关产品推荐
相关产品推荐

