免费注册 查看新帖 |

Chinaunix

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

合并文本中相同的字段 [复制链接]

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-20 10:22 |只看该作者 |倒序浏览
   这是shell版块中的以为朋友提的,文本中相同字段合并的问题,也见了一些,可是这种合并,感觉没有思路。求解思路。。。
etc/xml/validation/dataFileFormatDefs.xml:
  destinations:
    dtsystem@app8002:/mnt/configs/production02/default/itm
    dtsystem@app8003:/mnt/configs/production03/default/itm
    dtsystem@app8004:/mnt/configs/production04/default/itm
    dtsystem@app8005:/mnt/configs/production05/default/itm
etc/xml/validation/dataFileFormatDefs.xml:
  destinations:
    dtsystem@app8002:/opt/demandtec/production/etc/xml/validation
    dtsystem@app8003:/opt/demandtec/production/etc/xml/validation
    dtsystem@app8004:/opt/demandtec/production/etc/xml/validation
    dtsystem@app8005:/opt/demandtec/production/etc/xml/validation
    dtsystem@pns8001:/opt/demandtec/production/etc/xml/validation
buildNumber.txt:
  destinations:
    dtsystem@app8002:/opt/demandtec/production/lib
    dtsystem@app8003:/opt/demandtec/production/lib
    dtsystem@app8004:/opt/demandtec/production/lib

上面的文本,我要的结果是:

etc/xml/validation/dataFileFormatDefs.xml:
  destinations:
    dtsystem@app8002:/mnt/configs/production02/default/itm
    dtsystem@app8003:/mnt/configs/production03/default/itm
    dtsystem@app8004:/mnt/configs/production04/default/itm
    dtsystem@app8005:/mnt/configs/production05/default/itm
    dtsystem@app8002:/opt/demandtec/production/etc/xml/validation
    dtsystem@app8003:/opt/demandtec/production/etc/xml/validation
    dtsystem@app8004:/opt/demandtec/production/etc/xml/validation
    dtsystem@app8005:/opt/demandtec/production/etc/xml/validation
    dtsystem@pns8001:/opt/demandtec/production/etc/xml/validation
buildNumber.txt:
  destinations:
    dtsystem@app8002:/opt/demandtec/production/lib
    dtsystem@app8003:/opt/demandtec/production/lib
    dtsystem@app8004:/opt/demandtec/production/lib

这只是文件的一个片段,要求如果出现相同的连续两行(类似下面2行),保留第一次出现,其余出现都删除。需要查找的连续的两行中,第一行需要以小写字母开头,冒号结尾;第二行就是原封不动的“  destinations:”
etc/xml/validation/dataFileFormatDefs.xml:
  destinations:

论坛徽章:
0
2 [报告]
发表于 2012-09-20 10:30 |只看该作者
怎么看起来格式像YAML,可以考虑按照YAML做分析,有现成的模块

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
3 [报告]
发表于 2012-09-20 10:31 |只看该作者
回复 2# sjdy521


    因为文本是一行一行读取的,我用hash去重后,,顺序就乱了。。。

论坛徽章:
0
4 [报告]
发表于 2012-09-20 11:22 |只看该作者
mcshell 发表于 2012-09-20 10:31
回复 2# sjdy521

哪里重复了?
try~
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;

  5. my $str = do{local $/; <DATA>};
  6. my @chunks = split /^(?=\S)/m,$str;
  7. my %xml;
  8. while (@chunks) {
  9.     my $text = shift @chunks;
  10.     open my $fh, "<", \$text or die($!);
  11.     my $title  = <$fh>;     # etc/....
  12.        $title .= <$fh>;     #   dest...
  13.     push @{ $xml{$title} },<$fh>;
  14.     close($fh);
  15. }

  16. while (my($k,$v) = each %xml) {
  17.     print $k, @{$v};
  18. }

  19. __DATA__
  20. etc/xml/validation/dataFileFormatDefs.xml:
  21.   destinations:
  22.     dtsystem@app8002:/mnt/configs/production02/default/itm
  23.     dtsystem@app8003:/mnt/configs/production03/default/itm
  24.     dtsystem@app8004:/mnt/configs/production04/default/itm
  25.     dtsystem@app8005:/mnt/configs/production05/default/itm
  26. etc/xml/validation/dataFileFormatDefs.xml:
  27.   destinations:
  28.     dtsystem@app8002:/opt/demandtec/production/etc/xml/validation
  29.     dtsystem@app8003:/opt/demandtec/production/etc/xml/validation
  30.     dtsystem@app8004:/opt/demandtec/production/etc/xml/validation
  31.     dtsystem@app8005:/opt/demandtec/production/etc/xml/validation
  32.     dtsystem@pns8001:/opt/demandtec/production/etc/xml/validation
  33. buildNumber.txt:
  34.   destinations:
  35.     dtsystem@app8002:/opt/demandtec/production/lib
  36.     dtsystem@app8003:/opt/demandtec/production/lib
  37.     dtsystem@app8004:/opt/demandtec/production/lib
复制代码

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
5 [报告]
发表于 2012-09-20 11:47 |只看该作者
谢谢了。。~可以的。。我研究下你的脚本回复 4# kk861123


   

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
6 [报告]
发表于 2012-09-21 09:28 |只看该作者
这可以吗?
  1. use 5.016;
  2. my @a = split /\n(?=^[a-z])/m, do { local $/; <DATA> };
  3. my %h;
  4. for (@a) {
  5.     my ( $a, $b, $c ) = split /\n/, $_, 3;
  6.     say for $h{$a}++ ? () : ( $a, $b ), $c;
  7. }
复制代码

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
7 [报告]
发表于 2012-09-21 10:53 |只看该作者
本帖最后由 mcshell 于 2012-09-21 11:00 编辑

回复 6# rubyish


嗯,,可以的。。感觉code很简洁

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
8 [报告]
发表于 2012-09-21 20:28 |只看该作者
没见重复行啊

论坛徽章:
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
9 [报告]
发表于 2016-11-26 16:51 |只看该作者

  1. sed '/^[a-z].*:/{N;s/\n/,/}' file|awk '!a[$0]++'|tr , \\n
复制代码

论坛徽章:
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
10 [报告]
发表于 2016-11-26 17:47 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my ($pos, $cnt, $flag, @aData) = (0) x 3;
  5. while (<DATA>){
  6.     if (/\A(etc|build)/){
  7.         $pos = $1 eq 'etc' ? 0 : 1;
  8.         $flag = defined ($aData[$pos]) ? 1 : 0;
  9.         $cnt = 0 if ($flag);
  10.     }
  11.     next if ($flag and $cnt++ < 2);
  12.     $aData[$pos] .= $_;
  13. }

  14. print @aData;

  15. __DATA__
  16. etc/xml/validation/dataFileFormatDefs.xml:
  17.   destinations:
  18.     dtsystem@app8002:/mnt/configs/production02/default/itm
  19.     dtsystem@app8003:/mnt/configs/production03/default/itm
  20.     dtsystem@app8004:/mnt/configs/production04/default/itm
  21.     dtsystem@app8005:/mnt/configs/production05/default/itm
  22. etc/xml/validation/dataFileFormatDefs.xml:
  23.   destinations:
  24.     dtsystem@app8002:/opt/demandtec/production/etc/xml/validation
  25.     dtsystem@app8003:/opt/demandtec/production/etc/xml/validation
  26.     dtsystem@app8004:/opt/demandtec/production/etc/xml/validation
  27.     dtsystem@app8005:/opt/demandtec/production/etc/xml/validation
  28.     dtsystem@pns8001:/opt/demandtec/production/etc/xml/validation
  29. buildNumber.txt:
  30.   destinations:
  31.     dtsystem@app8002:/opt/demandtec/production/lib
  32.     dtsystem@app8003:/opt/demandtec/production/lib
  33.     dtsystem@app8004:/opt/demandtec/production/lib
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP