忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 1026 | 回复: 9

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

论坛徽章:
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
发表于 2018-04-16 11:01 |显示全部楼层
受教了,让我先翻一下

论坛徽章:
0
发表于 2018-04-16 16:20 来自手机 |显示全部楼层
哪位大师显身指教下,命令讲解扶贫也很重要,多谢了

论坛徽章:
16
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:0915-16赛季CBA联赛之八一
日期:2018-07-03 16:56:4615-16赛季CBA联赛之深圳
日期:2018-06-15 14:59:3715-16赛季CBA联赛之青岛
日期:2018-06-08 13:45:2815-16赛季CBA联赛之同曦
日期:2018-06-04 19:42:2015-16赛季CBA联赛之山东
日期:2018-05-30 12:44:59CU十四周年纪念徽章
日期:2018-05-15 11:36:3815-16赛季CBA联赛之广东
日期:2018-05-14 09:52:4215-16赛季CBA联赛之深圳
日期:2018-05-04 21:53:0815-16赛季CBA联赛之辽宁
日期:2018-04-02 14:03:3915-16赛季CBA联赛之北京
日期:2018-03-23 15:24:07
发表于 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
发表于 2018-04-17 22:26 |显示全部楼层
wh7211 发表于 2018-04-16 19:00
回复 1# gfan2

请问这个都没有去判断段落结束字符串,不对吧
来自安卓客户端来自客户端

论坛徽章:
0
发表于 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

论坛徽章:
16
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:0915-16赛季CBA联赛之八一
日期:2018-07-03 16:56:4615-16赛季CBA联赛之深圳
日期:2018-06-15 14:59:3715-16赛季CBA联赛之青岛
日期:2018-06-08 13:45:2815-16赛季CBA联赛之同曦
日期:2018-06-04 19:42:2015-16赛季CBA联赛之山东
日期:2018-05-30 12:44:59CU十四周年纪念徽章
日期:2018-05-15 11:36:3815-16赛季CBA联赛之广东
日期:2018-05-14 09:52:4215-16赛季CBA联赛之深圳
日期:2018-05-04 21:53:0815-16赛季CBA联赛之辽宁
日期:2018-04-02 14:03:3915-16赛季CBA联赛之北京
日期:2018-03-23 15:24:07
发表于 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>
复制代码

论坛徽章:
16
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:0915-16赛季CBA联赛之八一
日期:2018-07-03 16:56:4615-16赛季CBA联赛之深圳
日期:2018-06-15 14:59:3715-16赛季CBA联赛之青岛
日期:2018-06-08 13:45:2815-16赛季CBA联赛之同曦
日期:2018-06-04 19:42:2015-16赛季CBA联赛之山东
日期:2018-05-30 12:44:59CU十四周年纪念徽章
日期:2018-05-15 11:36:3815-16赛季CBA联赛之广东
日期:2018-05-14 09:52:4215-16赛季CBA联赛之深圳
日期:2018-05-04 21:53:0815-16赛季CBA联赛之辽宁
日期:2018-04-02 14:03:3915-16赛季CBA联赛之北京
日期:2018-03-23 15:24:07
发表于 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
复制代码

论坛徽章:
130
技术图书徽章
日期: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
发表于 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
发表于 2018-04-18 16:29 |显示全部楼层
多谢各位指教,命令测试结果已满足需求,再次感谢
来自安卓客户端来自客户端
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP