Awk脚本循环异常求助:无法生成预期输出结果
修复Awk脚本循环逻辑,实现OPTTYPE段数据过滤输出
问题核心
需求规则明确:匹配^OPTTYPE PTD SK ASG行后,处理后续内容:
- 若后续行无数据(NF=0),不输出对应PMP记录
- 若后续行有数据(NF>0),遍历所有行并输出完整关联内容
常见错误脚本示例
假设你当前的脚本存在循环逻辑混乱问题,比如这样:
/^PMP/ { pmp = $0 } /^OPTTYPE PTD SK ASG/ { while (getline > 0) { if (NF == 0) next else print pmp, $0 } }
该脚本的问题在于getline会直接跳过后续行的默认处理流程,导致状态丢失,且无法正确终止循环。
输入示例
PMP 001 SAMPLE_DATA1 OPTTYPE PTD SK ASG A 100 X Y B 200 M N PMP 002 SAMPLE_DATA2 OPTTYPE PTD SK ASG PMP 003 SAMPLE_DATA3 OPTTYPE PTD SK ASG C 300 P Q
预期输出
PMP 001 SAMPLE_DATA1 A 100 X Y PMP 001 SAMPLE_DATA1 B 200 M N PMP 003 SAMPLE_DATA3 C 300 P Q
修正后的Awk脚本
# 记录最近的PMP行内容 /^PMP/ { current_pmp = $0 next } # 匹配目标OPTTYPE行,开始处理后续数据 /^OPTTYPE PTD SK ASG/ { # 循环读取后续行,直到触发终止条件 while (getline > 0) { # 遇到空行,直接终止循环,不输出内容 if (NF == 0) { break } # 遇到新的PMP或OPTTYPE行,将当前行放回输入流,终止循环 if (/^PMP/ || /^OPTTYPE PTD SK ASG/) { ungetline break } # 有效数据行,输出关联内容 print current_pmp, $0 } next }
逻辑解释
- 状态记录:用
current_pmp变量存储最新的PMP行,确保后续数据能正确关联。 - 循环终止控制:
- 碰到空行直接跳出循环,不输出对应PMP记录
- 碰到新的PMP/OPTTYPE行时,用
ungetline将当前行放回输入流,避免丢失后续记录
- 数据输出:仅当读取到有效数据行时,才输出PMP行+数据行的关联内容,符合需求规则
内容的提问来源于stack exchange,提问作者Tatman
相关产品推荐
相关产品推荐

