![awk 匹配最后一条记录并打印](https://linux22.com/image/179408/awk%20%E5%8C%B9%E9%85%8D%E6%9C%80%E5%90%8E%E4%B8%80%E6%9D%A1%E8%AE%B0%E5%BD%95%E5%B9%B6%E6%89%93%E5%8D%B0.png)
我得到的记录是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