LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 983|回复: 1

awk 难题

[复制链接]
发表于 2008-5-27 21:04:08 | 显示全部楼层 |阅读模式
我有一个文件如下

<idr:IDR xsi:type="idr:FMType">
    <idr:IDRCreationTime>2008-05-27 16:21:03</idr:IDRCreationTime>
    <idr:seqNum>1</idr:seqNum>
    <idrrovinceID>999</idrrovinceID>
    <idr:ClassName>KF-04</idr:ClassName>
    <idr:InstanceName>fileDup -i ../config/unidup/unidup_40200_gprs.cfg -m unidup</idr:InstanceName>
    <idr:InstanceName_CN>GPRS统一查重</idr:InstanceName_CN>
    <idr:Address>192.5.1.8</idr:Address>
    <idr:KPIID>FM-01-KB-00-01</idr:KPIID>
    <idr:BeginTime>2008-05-27 16:18:02</idr:BeginTime>
    <idr:EndTime>2008-05-27 16:21:03</idr:EndTime>
    <idr:EventLevel>1</idr:EventLevel>
    <idr:Value>0</idr:Value>
    <idr: Desc>GPRS统一查重</idr: Desc>
</idr:IDR>

<idr:IDR xsi:type="idr:FMType">
    <idr:IDRCreationTime>2008-05-27 16:21:03</idr:IDRCreationTime>
    <idr:seqNum>2</idr:seqNum>
    <idrrovinceID>999</idrrovinceID>
    <idr:ClassName>KF-05</idr:ClassName>
    <idr:InstanceName>taskframe -i ../config/rating/rating_50200_gprs.cfg -m rating</idr:InstanceName>
    <idr:InstanceName_CN>GPRS批价</idr:InstanceName_CN>
    <idr:Address>192.5.1.8</idr:Address>
    <idr:KPIID>FM-01-KB-00-01</idr:KPIID>
    <idr:BeginTime>2008-05-27 16:18:02</idr:BeginTime>
    <idr:EndTime>2008-05-27 16:21:03</idr:EndTime>
    <idr:EventLevel>1</idr:EventLevel>
    <idr:Value>1</idr:Value>
    <idr: Desc>GPRS批价</idr: Desc>
</idr:IDR>

现在我的需求是:在一个匹配的<idr:IDR xsi:type="idr:FMType"> 和</idr:IDR>内,如果满足    <idr:Value>1</idr:Value> 则输出该闭合的标签,比如
第二个<idr:IDR xsi:type="idr:FMType"> 和</idr:IDR>中间的部分,有一个    <idr:Value>1</idr:Value>,则应该输出第二个匹配的<idr:IDR xsi:type="idr:FMType"></idr:IDR>
之间的内容:
<idr:IDR xsi:type="idr:FMType">
    <idr:IDRCreationTime>2008-05-27 16:21:03</idr:IDRCreationTime>
    <idr:seqNum>2</idr:seqNum>
    <idrrovinceID>999</idrrovinceID>
    <idr:ClassName>KF-05</idr:ClassName>
    <idr:InstanceName>taskframe -i ../config/rating/rating_50200_gprs.cfg -m rating</idr:InstanceName>
    <idr:InstanceName_CN>GPRS批价</idr:InstanceName_CN>
    <idr:Address>192.5.1.8</idr:Address>
    <idr:KPIID>FM-01-KB-00-01</idr:KPIID>
    <idr:BeginTime>2008-05-27 16:18:02</idr:BeginTime>
    <idr:EndTime>2008-05-27 16:21:03</idr:EndTime>
    <idr:EventLevel>1</idr:EventLevel>
    <idr:Value>1</idr:Value>
    <idr: Desc>GPRS批价</idr: Desc>
</idr:IDR>
我的想法是
awk 'BEGIN{RS="</idr:IDR>"}{if( $0 ~ /idr:Value>1/){ print $0}}' FM_09_080527162151_000.xml
但是不行,请各位大侠给出个主意。
发表于 2008-5-29 12:27:51 | 显示全部楼层
初学,参与一下:)

#!/usr/bin/perl -w
use strict;
open FILE,"data" or die "can not read data: $!";
my $para;
while(<FILE>)
{
    $para.=$_;     
}   
while( $para =~ s#(<idr:IDR xsi:type="idr:FMType">.*?</idr:IDR>)#\0#s )   
{
    my $value=$1;
    if ( $value =~ m#<idr:Value>1</idr:Value># )
    { print "$value\n"; }
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表