awk 匹配最后一条记录并打印

awk 匹配最后一条记录并打印

我得到的记录是fileinp

1 ABCDEFGHILM                12345678901234567   ABCD   X
1 CDEFGHILMNO                34567890123456789   BCDE   Y
1 EFGHILMNOPQ                56789012345678901   CDEF   Z
1 GHILMNOPQRS                78901234567890123   DEFG   W

当最后一个字符是 Y 或 Z 时,我想从字符 14 打印到字符 47,并附加最后一个匹配的字符。

预期结果为fileout

        34567890123456789Y
        56789012345678901Z

我尝试了很多代码,但都失败了,

gawk "{print /Y/ substr($1,14,33, length($1)-0)}" fileinp > fileout 

请问你能帮帮我吗?

实际上,这是一个完整的记录,这就是我搜索最后一个字符的原因

1 QWERTYUIOPASDFGHJK         ZXCVBNMLKJHGFDSAP   1234        12345678 12345ABCDEFGHIL12                                                                                                    202000Y

答案1

对于您提供的示例输入,其中最后一个字段是 1 个字符:

$ awk '$NF~/[YZ]/{print substr($0,14,33) $NF}' file
                34567890123456789Y
                56789012345678901Z

对于您后来提供的真实数据行,其中最后一个字段是多个字符,并且不假设 Y 或 Z 可能存在于最后一个字段中的位置:

$ awk 'match($0,/[YZ][^[:space:]]*$/){print substr($0,14,33) substr($0,RSTART,1)}' file
                34567890123456789Y
                56789012345678901Z

或者如果 Y 或 Z 始终是行中的最后一个字符:

$ awk '/[YZ]$/{print substr($0,14,33) substr($0,length($0))}' file
                34567890123456789Y
                56789012345678901Z

答案2

这几乎是正确的,但新记录后缺少 Y 或 Z

gawk "$NF~/Y|Z/{print substr($0,14,33)}" fileinp > fileout

结果:

        34567890123456789
        56789012345678901

预期结果:

        34567890123456789Y
        56789012345678901Z

答案3

我试试这个:

gawk "$NF~/Y|Z/{print substr($0,14,33) substr($0,194,1)}" fileinp > fileout

但我在最后一个字符之前得到这个空白字符

    34567890123456789 Y
    56789012345678901 Z

我也尝试过这个并且有效,但它并不是真正的最后一个字符:

gawk "$NF~/Y|Z/{print substr($0,14,33) substr($NF,7,1)}" fileinp > fileout

    34567890123456789Y
    56789012345678901Z

相关内容