加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 使用Awk处理每个记录具有不同固定宽度字段的文件

发布时间:2020-12-13 23:58:29 所属栏目:Linux 来源:网络整理
导读:我有遗留系统的一些数据文件,我想用Awk处理.每个文件都包含一个记录列表.有几种不同的记录类型,每种记录类型都有一组不同的固定宽度字段(没有字段分隔符).记录的前两个字符表示类型,然后您可以知道应该遵循哪些字段.文件可能如下所示: AAField1Field2Longer
我有遗留系统的一些数据文件,我想用Awk处理.每个文件都包含一个记录列表.有几种不同的记录类型,每种记录类型都有一组不同的固定宽度字段(没有字段分隔符).记录的前两个字符表示类型,然后您可以知道应该遵循哪些字段.文件可能如下所示:

AAField1Field2LongerField3
BBField4Field5Field6VeryVeryLongField7Field8
CCField99

使用Gawk我可以设置FIELDWIDTHS,但这适用于整个文件(除非我在某个记录的基础上缺少一些设置方法),或者我可以将FS设置为“”并处理文件中的一个字符一段时间,但这有点麻烦.

有没有一种使用Awk从这样的文件中提取字段的好方法?

编辑:是的,我可以使用Perl(或其他).我仍然很想知道是否有一种合理的方法可以用Awk做到这一点.

解决方法

希望这会引导您朝着正确的方向前进.假设您的多行记录保证由“CC”类型行终止,您可以使用简单的if-then逻辑预处理文本文件.我假设您需要在一行上使用fields1,5和7,并且需要一个示例awk脚本.

BEGIN {
        field1=""
        field5=""
        field7=""
}
{
    record_type = substr($0,1,2)
    if (record_type == "AA")
    {
        field1=substr($0,3,6)
    }
    else if (record_type == "BB")
    {
        field5=substr($0,9,6)
        field7=substr($0,21,18)
    }
    else if (record_type == "CC")
    {
        print field1"|"field5"|"field7
    }
}

创建一个名为program.awk的awk脚本文件,并将该代码弹入其中.使用以下命令执行脚本:

awk -f program.awk < my_multi_line_file.txt

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读