免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6020 | 回复: 4
打印 上一主题 下一主题

[文本处理] awk如何提取多个数据块的匹配行的最后一行的下一行数据? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-18 10:27 |只看该作者 |倒序浏览
原始数据如下:
MO                   BTSSWVER         
RXOCF-1              ERA-G05-R21-V01

RU  RUREVISION                           RUSERIALNO
0  BOE 602 14/1          R14D           X172211154   

    RUPOSITION                           RULOGICALID
    C:0 R:C SH: 8 SL: 76                 DX   DXU_21                   0

RU  RUREVISION                           RUSERIALNO
1  SEB1121095/1          R6E            STA63667299  

    RUPOSITION                           RULOGICALID
    C:0 R:C SH: 9 SL:---                 CABI 2206                     0

STATE  BLSTATE  INTERCNT  CONCNT  CONERRCNT  LASTFLT   LFREASON
OPER            00002                                   

MO                   BTSSWVER         
RXOCF-2              ERA-G05-R21-V01

RU  RUREVISION                           RUSERIALNO
0  BOE 602 21/1          R1C/B          X173514083   

    RUPOSITION                           RULOGICALID
    C:0 R:C SH: 8 SL: 76                 DX   DXU-23                   0

RU  RUREVISION                           RUSERIALNO
1  BFL 119 147/1         R5D            TB3A082538   

    RUPOSITION                           RULOGICALID
    C:0 R:C SH: 2 SL:  0                 CD   CDU_F9                   0

RU  RUREVISION                           RUSERIALNO
2  BFL 119 147/1         R7A            CD34599696   

    RUPOSITION                           RULOGICALID
    C:0 R:C SH: 2 SL: 28                 SC   SUP 6601                   1

STATE  BLSTATE  INTERCNT  CONCNT  CONERRCNT  LASTFLT   LFREASON
OPER            00005                                   
数据块为MO                   BTSSWVER至下一个MO                   BTSSWVER之间的数据,在此数据块中匹配RULOGICALID的最后一行,提取该行下一行的数据如第一个数据RXOCF-1提取到CABI 2206 ,以上数据输出结果为
RXOCF-1     CABI_2206
RXOCF-2     SC_SUP_6601
现无头绪,请各位大侠支招,谢谢。                                    

论坛徽章:
29
程序设计版块每日发帖之星
日期:2016-02-29 06:20:0015-16赛季CBA联赛之天津
日期:2016-08-10 10:33:1115-16赛季CBA联赛之深圳
日期:2016-08-17 15:07:2015-16赛季CBA联赛之佛山
日期:2016-11-07 11:33:5015-16赛季CBA联赛之广夏
日期:2016-11-15 09:13:31CU十四周年纪念徽章
日期:2016-11-24 14:12:25极客徽章
日期:2016-12-07 14:03:4015-16赛季CBA联赛之深圳
日期:2016-12-07 17:15:2715-16赛季CBA联赛之北京
日期:2016-12-22 09:30:0115-16赛季CBA联赛之深圳
日期:2016-12-22 10:49:2115-16赛季CBA联赛之山西
日期:2017-02-10 09:05:3215-16赛季CBA联赛之同曦
日期:2017-02-27 14:19:08
2 [报告]
发表于 2013-09-18 21:56 |只看该作者
#! /bin/sh

sed '/^\s*$/d' srcfile > tmpfile

while read line
do
    part1=`echo $line | awk '{print $1}'`
    if [ $part1 = "MO" ]; then
        getmo=1
        continue
    elif [ $part1 = "STATE" ]; then
        rulogicalid=`echo $prevline | awk -F: '{print $NF}' | awk '{for(i=2; i<NF; i++) printf("%s_", $i)}'`
        rulogicalid=${rulogicalid%_}
        echo -e "${mo}\t\t${rulogicalid}"
    else
        prevline=$line
    fi

    if [ $getmo -eq 1 ]; then
        mo="$part1"
        getmo=0
    fi
   
done < tmpfile

rm -f tmpfile

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
3 [报告]
发表于 2013-09-18 22:57 |只看该作者
回复 1# Ienovo_qq
  1. sed -nr '/MO +BTSSWVER/{n;s/^([^ ]+).*/\1/;h};/RULOGICALID/{n;s/.{41}(.*)[0-9]+$/\1/;s/ +$//;s/ +/_/g;H};/^STATE/{g;s/([^\n]+).*\n([^\n]+$)/\1\t\2/;p}'
复制代码

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
4 [报告]
发表于 2013-09-19 08:54 |只看该作者
回复 3# yinyuemi


    SS, 你的sed还没忘?

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
5 [报告]
发表于 2013-09-19 22:34 |只看该作者
回复 4# blackold


    黑哥, 好久不来啦
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP