免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 2144 | 回复: 27

[文本处理] 文件的增删改处理怎么做? [复制链接]

论坛徽章:
1
15-16赛季CBA联赛之广东
日期:2016-07-18 17:38:18
发表于 2016-09-26 15:18 |显示全部楼层
如下所示,有3个文件,分别是A,B,C,其中文件A是原始文件,文件B是新给的文件,文件C是最终改完的文件
修改的原则是:
1)service name的个数以B中的为准
2)如果在A中本来就有的service name,则新文件C里的直接用A中与service name相关的内容,不修改
3)如果在A中没有的service name,则新文件C里的service name相关的用B里的,但是add name只保留一个
4)A中有的service name但是B中没有的,在文件C里不出现……
5)实际中增和删的不多,但是service name一样的非常多,所以理论上以A修改会比较快吧……

啊啊啊求大神,这个好难,本宝不会…

详情如图


A.png
B.png
C.png

论坛徽章:
1
15-16赛季CBA联赛之广东
日期:2016-07-18 17:38:18
发表于 2016-09-26 15:43 |显示全部楼层
我先用笨方法做吧,各位有简单的命令或方法请不吝赐教哦,万分感谢~

论坛徽章:
1
15-16赛季CBA联赛之江苏
日期:2016-10-26 16:19:04
发表于 2016-09-27 16:12 |显示全部楼层
楼主把文本发一份

论坛徽章:
1
15-16赛季CBA联赛之广东
日期:2016-07-18 17:38:18
发表于 2016-09-27 16:34 |显示全部楼层
回复 3# fh21_xuejinlian
===============================================
文件A:
<?xml version="1.0" encoding="utf-8" ?>
<!--有aaa,bbb,ccc三个(实际中的数目不定)-->
<Service name="aaa" id="3" >
        <Commmunication>
                 xxxxxxxxxxxxxxxxxx
        </Commmunication>
        <Loadbalance>
                <Server deadTimeout="0">
                        <add name="aaa1" host="aaa1.xxx.dns" port="xxx" />
                </Server>
        </Loadbalance>
</Service>

<Service name="bbb" id="2" >
        <Commmunication>
                 xxxxxxxxxxxxxxxxxx
        </Commmunication>
        <Loadbalance>
                <Server deadTimeout="0">
                        <add name="bbb1" host="bbb1.xxx.dns" port="xxx" />
                </Server>
        </Loadbalance>
</Service>

<Service  id="1" name="ccc">
        <Commmunication>
                 xxxxxxxxxxxxxxxxxx
        </Commmunication>
        <Loadbalance>
                <Server deadTimeout="0">
                        <add name="ccc1" host="ccc1.xxx.dns" port="xxx" />
                </Server>
        </Loadbalance>
</Service>


===============================================
文件B:

<?xml version="1.0" encoding="utf-8" ?>
<!--本文件中有bbb,ddd两个(实际中数目不定),与A文件比,ddd是新增的,少了aaa和ccc,跟A一样也有的是bbb-->
<Service name="bbb" id="2" >
        <Commmunication>
                 xxxxxxxxxxxxxxxxxx
        </Commmunication>
        <Loadbalance>
                <Server deadTimeout="0">
                        <add name="bbb5" host="bbb5.xxx.dns" port="xxx" />
                        <add name="bbb6" host="bbb6.xxx.dns" port="xxx" />
                </Server>
        </Loadbalance>
</Service>

<Service name="ddd" id="3" >
        <Commmunication>
                 xxxxxxxxxxxxxxxxxx
        </Commmunication>
        <Loadbalance>
                <Server deadTimeout="0">
                        <add name="ddd1" host="ddd1.xxx.dns" port="xxx" />
                        <add name="ddd2" host="ddd2.xxx.dns" port="xxx" />
                </Server>
        </Loadbalance>
</Service>

<Service name="bb" id="2" >
        <Commmunication>
                 xxxxxxxxxxxxxxxxxx
        </Commmunication>
        <Loadbalance>
                <Server deadTimeout="0">
                        <add name="bb5" host="bbb5.xxx.dns" port="xxx" />
                        <add name="bb6" host="bbb6.xxx.dns" port="xxx" />
                </Server>
        </Loadbalance>
</Service>


===============================================
文件C(期望生成的):


<?xml version="1.0" encoding="utf-8" ?>
<!--要求是以B文件的节点为准,且add name有多个的话只保留一个,
    但是如果A中有同样的service name的话(如本例中的bbb),
        就直接把A里的拿过来用-->
<!--实际中service name会非常多,增加和删减的会很少,所以建议在A文件的基础上修改-->
<Service name="bbb" id="2" >
        <Commmunication>
                 xxxxxxxxxxxxxxxxxx
        </Commmunication>
        <Loadbalance>
                <Server deadTimeout="0">
                        <add name="bbb1" host="bbb1.xxx.dns" port="xxx" />
                </Server>
        </Loadbalance>
</Service>

<Service name="ddd" id="3" >
        <Commmunication>
                 xxxxxxxxxxxxxxxxxx
        </Commmunication>
        <Loadbalance>
                <Server deadTimeout="0">
                        <add name="ddd1" host="ddd1.xxx.dns" port="xxx" />
                </Server>
        </Loadbalance>
</Service>



==================================================
貌似不能上传文件,我就直接粘贴了,大神,你让我看到了曙光思密达~

论坛徽章:
1
15-16赛季CBA联赛之广东
日期:2016-07-18 17:38:18
发表于 2016-09-27 16:38 |显示全部楼层
回复 3# fh21_xuejinlian

期望生成的错了,落了一个bb,应该是下面这样的文件C:
<?xml version="1.0" encoding="utf-8" ?>
<!--要求是以B文件的节点为准,且add name有多个的话只保留一个,
    但是如果A中有同样的service name的话(如本例中的bbb),
        就直接把A里的拿过来用-->
<!--实际中service name会非常多,增加和删减的会很少,所以建议在A文件的基础上修改-->
<Service name="bbb" id="2" >
        <Commmunication>
                 xxxxxxxxxxxxxxxxxx
        </Commmunication>
        <Loadbalance>
                <Server deadTimeout="0">
                        <add name="bbb1" host="bbb1.xxx.dns" port="xxx" />
                </Server>
        </Loadbalance>
</Service>

<Service name="ddd" id="3" >
        <Commmunication>
                 xxxxxxxxxxxxxxxxxx
        </Commmunication>
        <Loadbalance>
                <Server deadTimeout="0">
                        <add name="ddd1" host="ddd1.xxx.dns" port="xxx" />
                </Server>
        </Loadbalance>
</Service>

<Service name="bb" id="2" >
        <Commmunication>
                 xxxxxxxxxxxxxxxxxx
        </Commmunication>
        <Loadbalance>
                <Server deadTimeout="0">
                        <add name="bb5" host="bbb5.xxx.dns" port="xxx" />
                </Server>
        </Loadbalance>
</Service>

论坛徽章:
1
15-16赛季CBA联赛之广东
日期:2016-07-18 17:38:18
发表于 2016-09-27 16:42 |显示全部楼层
回复 3# fh21_xuejinlian

bb是我新添加的, 因为有些时候service name会出现是包含的情况~~所以对应的有些注释还木有改……

论坛徽章:
1
15-16赛季CBA联赛之广东
日期:2016-07-18 17:38:18
发表于 2016-09-27 16:42 |显示全部楼层
回复 3# fh21_xuejinlian

bb是我新添加的, 因为有些时候service name会出现是包含的情况~~所以对应的有些注释还木有改……

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2016-09-27 18:31 |显示全部楼层
本帖最后由 moperyblue 于 2016-09-29 11:20 编辑
  1. #!/bin/bash

  2. aFile="A"
  3. bFile="B"
  4. cFile="C"

  5. [[ -f $cFile ]] && rm -rf "$cFile"

  6. arr1=(`grep -Ff <(grep -oP '<Service.*name="\K[^"]*' "$bFile") <(grep -oP '<Service.*name="\K[^"]*' "$aFile")`) #交集
  7. arr2=(`grep -vFf <(grep -oP '<Service.*name="\K[^"]*' "$aFile") <(grep -oP '<Service.*name="\K[^"]*' "$bFile")`)

  8. if [[ ${#arr1[@]} -gt 0 ]]; then
  9.     for (( i = 0; i < ${#arr1[@]}; i++ )); do
  10.         grep -oPz '<Service.*name="'"${arr1[i]}"'".*\n(.*\n)*?</Service>\n' "$aFile" >> "$cFile"
  11.     done
  12. fi

  13. if [[ ${#arr2[@]} -gt 0 ]]; then
  14.     for (( i = 0; i < ${#arr2[@]}; i++ )); do
  15.        sed -n '/<Service.*name="'"${arr2[i]}"'"/{:a;N;/<add name=/!ba;p;:b;n;/<\/Server>/!bb;:c;N;/<\/Service>/!bc;s/$/\n/p}' "$bFile" >> "$cFile"
  16.    done
  17. fi
复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-09-27 19:04 |显示全部楼层
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. sub Load_Data{
  5.     local @ARGV = pop;
  6.     my $hStat = pop;
  7.     my $title = <>;
  8.     local $/ = '';
  9.     while (<>){
  10.         next if (/\A<!--/ or /\A\s*\z/);
  11.         chomp ($hStat->{$1} = $_) if (/<Service\s+.*?name="([^"]+)/);
  12.     }
  13.     $title;
  14. }

  15. my $ha = {};
  16. my $hb = {};

  17. Load_Data ($ha, shift);
  18. my $title = Load_Data ($hb, shift);
  19. print $title;

  20. for (keys %$hb){
  21.     exists $ha->{$_} ? ($hb->{$_} = $ha->{$_}) :  $hb->{$_} =~ s/(<add)\s+name\N+\n\K(\s*\1\N+\n)*//;
  22.     print $hb->{$_}, "\n\n";
  23. }
复制代码

论坛徽章:
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
发表于 2016-09-27 19:45 |显示全部楼层
回复 4# ylypt123

$ awk 'function chk(){if(SE)SE=S=0;if(match($0,"Service.+name=\"([^\"]+)",a)){SN=a[1];P=S=A=1};if(/<\/Service/)SE=1}FNR==NR{chk();if(/add name/){if(!A)next;A=0};if(S)d[SN]=d[SN]$0"\n";next}{chk();if(S&&d[SN]){if(P){P=0;printf d[SN]}next}if(/add name/){if(A)print;A=0;next}print}' A.txt B.txt > C.txt
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP