如何用AWK格式化含TE后缀字段的杂乱文本文件?
AWK处理以“TE”结尾字段的文本格式化问题
我有一个格式极其混乱的文本文件,其中每条记录的首个字段均以“TE”结尾。尝试用AWK设置RS="TE"处理后结果接近目标但未完全符合预期,希望将文本整理为指定的清晰格式,求正确的AWK模式识别方法。
原文件内容
cat file1 220914230708E2022091416195068167642220000039TE OKaaaaaaaaaa 0000000017316354827094010600 aaaaaaaaaa 001 2022091416123467540807620001105TE OKbbbbbbbbbb 0000000292934354487119918680 bbbbbbbbbb 001 2022091416483567002141420000731TE OKDFDFJFSDFHS 0000000199137867325032383540 2022091419204463543285020000412TE OKcccccccccc 0000000111113867351043007780 cccccccccc 1EP 2022091419372363503707220000233TE OKddddddddddd 0000000067822353828105648630 ddddddddddd 001
尝试的AWK命令
awk ' BEGIN { RS = "TE" } { if ( $0 ~ "OK" ) print "TE" $0 }' file1
当前输出
TE OKaaaaaaaaaa 0000000017316354827094010600 aaaaaaaaaa 001 2022091416123467540807620001105 TE OKbbbbbbbbbb 0000000292934354487119918680 bbbbbbbbbb 001 2022091416483567002141420000731 TE OKDFDFJFSDFHS 0000000199137867325032383540 2022091419204463543285020000412 TE OKcccccccccc 0000000111113867351043007780 cccccccccc 1EP 2022091419372363503707220000233 TE OKddddddddddd 0000000067822353828105648630 ddddddddddd 001
预期格式
2022091416123467540807620001105TE OKbbbbbbbbbb 0000000292934354487119918680 bbbbbbbbbb 001 2022091416483567002141420000731TE OKDFDFJFSDFHS 0000000199137867325032383540 2022091419204463543285020000412TE OKcccccccccc 0000000111113867351043007780 cccccccccc 1EP 2022091419372363503707220000233TE OKddddddddddd 0000000067822353828105648630 ddddddddddd 001
解决方案
之前的RS="TE"设置会将每个“TE”作为记录分隔符,导致记录的前缀(即结尾为TE的字段)和后续内容被拆分,无法直接组合成预期的行结构。可以通过正则匹配完整记录并格式化输出:
awk '{ while (match($0, /([0-9]+TE)\s+(OK\S+)\s+([0-9]+)\s+(\S+)\s+(\S+)/, arr)) { printf "%-35s %-25s %-35s %-20s %s\n", arr[1], arr[2], arr[3], arr[4], arr[5] $0 = substr($0, RSTART + RLENGTH) } }' file1
说明
- 使用
match()函数配合正则表达式,精准捕获完整记录的各个字段:([0-9]+TE):提取以TE结尾的数字前缀字段\s+(OK\S+):提取OK开头的标识字段\s+([0-9]+):提取长数字序列字段\s+(\S+):提取字符串字段\s+(\S+):提取最后一个代码字段
- 用
printf的%-N格式设置左对齐并固定宽度,实现整齐排版 - 处理完一个匹配项后,用
substr()截断已处理内容,继续匹配剩余文本
内容的提问来源于stack exchange,提问作者Alan Mackey
相关产品推荐
相关产品推荐

