免费注册 查看新帖 |

Chinaunix

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

awk 难题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-27 21:05 |只看该作者 |倒序浏览
我有一个文件如下
<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>
    <idresc>GPRS统一查重</idresc>
</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>
    <idresc>GPRS批价</idresc>
</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>
    <idresc>GPRS批价</idresc>
</idr:IDR>
我的想法是
awk 'BEGIN{RS="</idr:IDR>"}{if( $0 ~ /idr:Value>1/){ print $0}}' FM_09_080527162151_000.xml
但是不行,请各位大侠给出个主意。

论坛徽章:
0
2 [报告]
发表于 2008-05-27 21:20 |只看该作者
sed -e 's#</ide:IDR>#&\n#' urfile|awk 'BEGIN {FS="\n";RS=""} /<idr:value>1<idr:value>/'

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-01-24 06:20:00
3 [报告]
发表于 2008-05-27 22:07 |只看该作者
  1. sed -n '/<idr:IDR xsi:type="idr:FMType">/,/<\/idr:IDR>/'p xx|sed '/<\/idr:IDR>/!{
  2. H
  3. d
  4. }
  5. /<\/idr:IDR>/{
  6. H
  7. s/.*//
  8. x
  9. s/^\n//
  10. /<idr:Value>1<\/idr:Value>/!d
  11. }'
复制代码

论坛徽章:
0
4 [报告]
发表于 2008-05-27 23:07 |只看该作者
bash-3.2$ echo "<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 unid
up</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>
    <idresc>GPRS统一查重</idresc>
</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 ra
ting</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>
    <idresc>GPRS批价</idresc>
</idr:IDR>
"|awk 'BEGIN{FS="\n";RS="</idr:IDR>[ \n\t]*";ORS="</idr:IDR>\n";}
/<idr:Value>1<\/idr:Value>/{print $0;}'

<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>
    <idresc>GPRS批价</idresc>
</idr:IDR>
bash-3.2$

[ 本帖最后由 zhangshebao 于 2008-5-27 23:23 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-05-28 09:34 |只看该作者
原帖由 xiaogangzhao 于 2008-5-27 21:05 发表
我有一个文件如下

    2008-05-27 16:21:03
    1
    999
    KF-04
    fileDup -i ../config/unidup/unidup_40200_gprs.cfg -m unidup
    GPRS统一查重
    192.5.1.8
    FM-01-KB-00-01
    2 ...

i try your command  
it works;
check your awk version;
may be worked with gawk

论坛徽章:
0
6 [报告]
发表于 2008-05-28 09:45 |只看该作者

回复 #4 zhangshebao 的帖子

您的办法我试了,在我的hp unix上面不起作用啊,显示不出来结果。但是在linux上是可以的。有别的办法吗?

论坛徽章:
0
7 [报告]
发表于 2008-05-28 09:53 |只看该作者

回复 #5 nuclearxin 的帖子

有别的办法吗?我的是hp-unix ,我这个上面不行啊。不知道为什么

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
8 [报告]
发表于 2008-05-28 10:20 |只看该作者
用其他工具吧。nawk(New awk)中可以给RS赋一个字符串,但只有第一个字符会作为记录分隔符。old awk就更不用说了。
不过我的资料比较老,也许nawk有新的扩展也不一定。试试用nawk代替awk,不行就另想办法吧。

论坛徽章:
0
9 [报告]
发表于 2008-05-28 10:29 |只看该作者

回复 #8 woodie 的帖子

好的,多谢!!

论坛徽章:
0
10 [报告]
发表于 2008-05-28 10:30 |只看该作者
$ grep  "<idr:Value>2</idr:Value>"  xx && sed -n '/<idr:IDR xsi:type="idr:FM
Type">/,/<\/idr:IDR>/'p xx
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP