基于第9、11列值更新第2列的Awk代码输出错误,请求排查
问题排查与修复方案
先直接点出你awk代码里的两个核心错误,这就是导致输出不符合预期的根源:
1. 条件判断误用赋值运算符
你写的 ($11="INV") 是把字符串INV赋值给第11列,而非判断第11列是否等于INV。赋值操作在条件语句里会被视为“真值”,所以不管第11列实际是什么内容,这个条件都会成立,进而错误地修改第2列的值。
2. substr 函数起始索引错误
awk的substr(s, start, length)函数中,起始位置是从1开始计数的(不是0)。你写的substr($9,0,2)会从不存在的第0位开始截取,返回的结果不符合预期,导致无法正确匹配第9列的前两位字符。
修正后的基础版本代码
把上述两个问题修复后,代码就能正常工作了:
awk -F"|" -v OFS="|" ' { if ((substr($9,1,2)=="02") && ($11=="INV")) $2="SAP_OSR_INV_FEB" if ((substr($9,1,2)=="03") && ($11=="INV")) $2="SAP_OSR_INV_MAR" if ((substr($9,1,2)=="04") && ($11=="INV")) $2="SAP_OSR_INV_APR" if ((substr($9,1,2)=="05") && ($11=="INV")) $2="SAP_OSR_INV_MAY" if ((substr($9,1,2)=="06") && ($11=="INV")) $2="SAP_OSR_INV_JUN" print $0 } '
更易维护的优化版本
如果后续需要添加更多月份的规则,用数组映射的方式会更简洁,也方便后续扩展:
awk -F"|" -v OFS="|" ' BEGIN { # 建立月份前缀到目标值的映射表 monthMap["02"] = "SAP_OSR_INV_FEB" monthMap["03"] = "SAP_OSR_INV_MAR" monthMap["04"] = "SAP_OSR_INV_APR" monthMap["05"] = "SAP_OSR_INV_MAY" monthMap["06"] = "SAP_OSR_INV_JUN" } $11 == "INV" { prefix = substr($9,1,2) # 如果前缀在映射表中存在,就更新第2列 if (prefix in monthMap) $2 = monthMap[prefix] } { print $0 } '
后续要新增月份规则,只需要在BEGIN块的映射表里添加新的键值对即可,不用重复写一堆if判断。
内容的提问来源于stack exchange,提问作者as7951
相关产品推荐
相关产品推荐

