You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

说明

  1. 使用match()函数配合正则表达式,精准捕获完整记录的各个字段:
    • ([0-9]+TE):提取以TE结尾的数字前缀字段
    • \s+(OK\S+):提取OK开头的标识字段
    • \s+([0-9]+):提取长数字序列字段
    • \s+(\S+):提取字符串字段
    • \s+(\S+):提取最后一个代码字段
  2. 用printf的%-N格式设置左对齐并固定宽度,实现整齐排版
  3. 处理完一个匹配项后,用substr()截断已处理内容,继续匹配剩余文本

内容的提问来源于stack exchange,提问作者Alan Mackey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 08:55:19