免费注册 查看新帖 |

Chinaunix

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

[文本处理] awk处理xml段落问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-04-16 10:12 |只看该作者 |倒序浏览
本帖最后由 gfan2 于 2018-04-16 16:19 编辑

请教,谢谢。
使用awk根据外部条件处理xml段落, 如 xml文件中name里能匹配上外部条件的一行,则删除该Name的<matchine到<matchine>段落

外部条件文件内容cat T1
room-177
room-178
room-348
...
...

T2.xml文件:
<?xml version="1.0"?>
<system>
   <machine class="TESTGROUP361" Name="group/room-178/class-730" operation="create" >
         <server name="log_collect">
            <processes>1</processes>
            <threads>1</threads>
            <options>-t1 </options>
            <desc/>
         </server>
         <server name="dcs_fresh">
            <processes>1</processes>
            <threads>1</threads>
            <options>-a192.168.1.1</options>
            <desc/>
         </server>
   </machine>
   <machine class="TESTGROUP472" Name="group/room-349/class-970" operation="create" >name="web02">
         <server name="log_collect">
            <processes>2</processes>
            <threads>2</threads>
            <options>-t2 </options>
            <desc/>
         </server>
         <server name="dcs_fresh">
            <processes>2</processes>
            <threads>2</threads>
            <options>-a192.168.1.2</options>
            <desc/>
         </server>
   </machine>
   <machine class="TESTGROUP971" Name="group/room-286/class-340" operation="create" >name="web02">
         <server name="log_collect">
            <processes>2</processes>
            <threads>2</threads>
            <options>-t2 </options>
            <desc/>
         </server>
         <server name="dcs_fresh">
            <processes>3</processes>
            <threads>3</threads>
            <options>-a192.168.1.3</options>
            <desc/>
         </server>
   </machine>  
....
....
....
....
</system>

论坛徽章:
0
2 [报告]
发表于 2018-04-16 11:01 |只看该作者
受教了,让我先翻一下

论坛徽章:
0
3 [报告]
发表于 2018-04-16 16:20 来自手机 |只看该作者
哪位大师显身指教下,命令讲解扶贫也很重要,多谢了

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
4 [报告]
发表于 2018-04-16 19:00 |只看该作者
回复 1# gfan2


  1. awk 'FILENAME==ARGV[1]{a[$0]++;next}/<machine/{split($0,t,"/")}!a[t[2]]' T1 T2.xml
复制代码

论坛徽章:
0
5 [报告]
发表于 2018-04-17 22:26 |只看该作者
wh7211 发表于 2018-04-16 19:00
回复 1# gfan2

请问这个都没有去判断段落结束字符串,不对吧

论坛徽章:
0
6 [报告]
发表于 2018-04-18 07:22 |只看该作者
回复 4# wh7211

试过了,绝大部分匹配条件的段落都可以删掉,但下面的这种情况没有删掉,应该再怎么改进。

   <machine class="TESTGROUP361" Name="group/room-178" operation="create" >
          <server name="log_collect">
             <processes>1</processes>
             <threads>1</threads>
             <options>-t1 </options>
             <desc/>
          </server>
          <server name="dcs_fresh">
             <processes>1</processes>
             <threads>1</threads>
             <options>-a192.168.0.1</options>
             <desc/>
          </server>
    </machine>

另外请帮忙解释命令实现的原理, 多谢了, awk 'FILENAME==ARGV[1]{a[$0]++;next}/<machine/{split($0,t,"/")}!a[t[2]]' T1 T2.xml

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
7 [报告]
发表于 2018-04-18 10:43 |只看该作者
本帖最后由 wh7211 于 2018-04-18 11:27 编辑

回复 6# gfan2


试过了,绝大部分匹配条件的段落都可以删掉,但下面的这种情况没有删掉,应该再怎么改进。

   <machine class="TESTGROUP361" Name="group/room-178" operation="create" >

没有删除是由于“T1中的字符串在T2.xml中的位置没有规律”导致的,比如,1楼的T2.xml中字符串是『/room-178/』,而6楼的T2.xml中字符串是『/room-178』

  1. T1中的字符串在T2.xml中的位置没有规律,使用下面代码:
  2. cat T1
  3. room-177
  4. room-178
  5. room-348

  6. cat T2.xml
  7. <?xml version="1.0"?>
  8. <system>
  9.    <machine class="TESTGROUP361" Name="group/room-178" operation="create" >
  10.          <server name="log_collect">
  11.             <processes>1</processes>
  12.             <threads>1</threads>
  13.             <options>-t1 </options>
  14.             <desc/>
  15.          </server>
  16.          <server name="dcs_fresh">
  17.             <processes>1</processes>
  18.             <threads>1</threads>
  19.             <options>-a192.168.0.1</options>
  20.             <desc/>
  21.          </server>
  22.    </machine>
  23.    <machine class="TESTGROUP361" Name="group/room-178/class-730" operation="create" >
  24.          <server name="log_collect">
  25.             <processes>1</processes>
  26.             <threads>1</threads>
  27.             <options>-t1 </options>
  28.             <desc/>
  29.          </server>
  30.          <server name="dcs_fresh">
  31.             <processes>1</processes>
  32.             <threads>1</threads>
  33.             <options>-a192.168.1.1</options>
  34.             <desc/>
  35.          </server>
  36.    </machine>
  37.    <machine class="TESTGROUP472" Name="group/room-349/class-970" operation="create" >name="web02">
  38.          <server name="log_collect">
  39.             <processes>2</processes>
  40.             <threads>2</threads>
  41.             <options>-t2 </options>
  42.             <desc/>
  43.          </server>
  44.          <server name="dcs_fresh">
  45.             <processes>2</processes>
  46.             <threads>2</threads>
  47.             <options>-a192.168.1.2</options>
  48.             <desc/>
  49.          </server>
  50.    </machine>
  51.    <machine class="TESTGROUP971" Name="group/room-286/class-340" operation="create" >name="web02">
  52.          <server name="log_collect">
  53.             <processes>2</processes>
  54.             <threads>2</threads>
  55.             <options>-t2 </options>
  56.             <desc/>
  57.          </server>
  58.          <server name="dcs_fresh">
  59.             <processes>3</processes>
  60.             <threads>3</threads>
  61.             <options>-a192.168.1.3</options>
  62.             <desc/>
  63.          </server>
  64.    </machine>  
  65.    <machine class="TESTGROUP361" Name="group/a/b/c/room-178/d/e/f" operation="create" >
  66.          <server name="log_collect">
  67.             <processes>1</processes>
  68.             <threads>1</threads>
  69.             <options>-t1 </options>
  70.             <desc/>
  71.          </server>
  72.          <server name="dcs_fresh">
  73.             <processes>1</processes>
  74.             <threads>1</threads>
  75.             <options>-a192.168.0.1</options>
  76.             <desc/>
  77.          </server>
  78.    </machine>
  79. ....
  80. ....
  81. ....
  82. ....
  83. </system>

  84. awk 'FILENAME==ARGV[1]{a[$0]++;next}/<machine/{for(i in a){if($0~i){f=1}}}!f;/<\/machine/{f=0}' T1 T2.xml
  85. <?xml version="1.0"?>
  86. <system>
  87.    <machine class="TESTGROUP472" Name="group/room-349/class-970" operation="create" >name="web02">
  88.          <server name="log_collect">
  89.             <processes>2</processes>
  90.             <threads>2</threads>
  91.             <options>-t2 </options>
  92.             <desc/>
  93.          </server>
  94.          <server name="dcs_fresh">
  95.             <processes>2</processes>
  96.             <threads>2</threads>
  97.             <options>-a192.168.1.2</options>
  98.             <desc/>
  99.          </server>
  100.    </machine>
  101.    <machine class="TESTGROUP971" Name="group/room-286/class-340" operation="create" >name="web02">
  102.          <server name="log_collect">
  103.             <processes>2</processes>
  104.             <threads>2</threads>
  105.             <options>-t2 </options>
  106.             <desc/>
  107.          </server>
  108.          <server name="dcs_fresh">
  109.             <processes>3</processes>
  110.             <threads>3</threads>
  111.             <options>-a192.168.1.3</options>
  112.             <desc/>
  113.          </server>
  114.    </machine>  
  115. ....
  116. ....
  117. ....
  118. ....
  119. </system>
复制代码

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
8 [报告]
发表于 2018-04-18 10:46 |只看该作者
本帖最后由 wh7211 于 2018-04-18 11:36 编辑

回复 6# gfan2


另外请帮忙解释命令实现的原理
  1. awk 'FILENAME==ARGV[1]{a[$0]++;next}/<machine/{for(i in a){if($0~i){f=1}}}!f;/<\/machine/{f=0}' T1 T2.xml

  2. 『FILENAME==ARGV[1]{a[$0]++;next}』:处理第1个文件T1,创建数组a
  3. 『/<machine/{for(i in a){if($0~i){f=1}}}』:处理第2个文件T2.xml,只要数组a的成员有1个出现在『<machine』这一行则f为1
  4. 『!f』:处理第2个文件T2.xml,如果f为1则不打印(即删除),如果f为0则打印
  5. 『/<\/machine/{f=0}』:处理第2个文件T2.xml,如果当前行匹配『</machine』则f为0
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
9 [报告]
发表于 2018-04-18 14:37 |只看该作者
回复 1# gfan2

$ awk 'FNR==NR{a[$1]=1;next}/<machine/{D=0;for(n in a)if($0~a[n]){D=1;next}}!D{print}/<\/machine/{D=0}' T1 T2.xml
<?xml version="1.0"?>
<system>
   <machine class="TESTGROUP472" Name="group/room-349/class-970" operation="create" >name="web02">
         <server name="log_collect">
            <processes>2</processes>
            <threads>2</threads>
            <options>-t2 </options>
            <desc/>
         </server>
         <server name="dcs_fresh">
            <processes>2</processes>
            <threads>2</threads>
            <options>-a192.168.1.2</options>
            <desc/>
         </server>
   </machine>
....
....
....
....
</system>

论坛徽章:
0
10 [报告]
发表于 2018-04-18 16:29 |只看该作者
多谢各位指教,命令测试结果已满足需求,再次感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP