如何优化处理特定行的Awk程序,使其更简洁优雅?
优化Awk程序:迁移指定行的字段内容
我编写的Awk程序可实现需求:查找所有以130AB开头的行,若第2个字段包含数据,则将该字段内容移至第9个字段。程序运行正常,但希望代码更简洁清晰,特此请求优化建议。
输入文件内容(myFile.txt)
130DD2532||1|||1| 130AB00100501||20|17112023|17112023||N|||0|| 130DD2532||1|||1| 130AB00100502||20|17112023|17112023||N|||0|| 130DD2532||1|||1| 130AB00100112||20|17112023|17112023||N|||0|| 130DD2532||1|||1| 130AB00100113|00100113|20|17112023|17112023||N|||0||
原Awk程序(prog.awk)
/^130AB/ { if ($2==""){print $1"|"$2"|"$3"|"$4"|"$5"|"$6"|"$7"|"$8"|"$9"|"$10"|"$11"|"$12"|"$13"|"$14"|"$15} else { print $1"|""|"$3"|"$4"|"$5"|"$6"|"$7"|"$8"|"$2"|"$10"|"$11"|"$12"|"$13"|"$14"|"$15}; next; }; { print; }
执行命令
awk -F "|" -f prog.awk myFile.txt > newFile.txt
当前输出结果(newFile.txt)
130DD2532||1|||1| 130AB00100501||20|17112023|17112023||N|||0||||| 130DD2532||1|||1| 130AB00100502||20|17112023|17112023||N|||0||||| 130DD2532||1|||1| 130AB00100112||20|17112023|17112023||N|||0||||| 130DD2532||1|||1| 130AB00100113||20|17112023|17112023||N||00100113|0|||||
优化方案
方案1:简洁清晰的标准写法
利用Awk的字段重赋值机制,结合统一的输入输出分隔符,彻底避免手动拼接字段的繁琐:
BEGIN { FS = OFS = "|" } /^130AB/ { if ($2 != "") { $9 = $2 $2 = "" } print next } 1 # 其他行直接输出
优化点解析
- 在
BEGIN块统一设置FS(输入分隔符)和OFS(输出分隔符)为|,无需在命令行或代码中重复指定 - 直接修改字段值:将非空的
$2赋值给$9,再清空$2,逻辑直观 - 用
1替代{print}:Awk中非0值会触发默认打印动作,代码更紧凑 - 避免手动拼接所有字段,减少拼写错误的可能,也更容易维护
方案2:极简紧凑写法
如果熟悉Awk语法,可以进一步简化逻辑为一行,保持可读性的同时缩短代码:
BEGIN { FS = OFS = "|" } /^130AB/ { $2 != "" && ($9 = $2, $2 = ""); print; next } 1
内容的提问来源于stack exchange,提问作者Abou Ilyès
相关产品推荐
相关产品推荐

