免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1693 | 回复: 9

[求助讨论]用Perl合并两文本的思路 [复制链接]

论坛徽章:
0
发表于 2012-10-16 17:56 |显示全部楼层
有两个文本A和B,每个文本都N多行。
两个文本格式一样,类似:
  1. 000001 blabla...
  2. 000001 gagaga...
  3. 000001 cacacac...
  4. 000002 qiaqia....
  5. 000002 hahaha...
  6. 000003 miamia....
  7. .......
复制代码
现在想写一个脚本,把两个文本按照第一列的数字顺序合并一下,即最后的输出是这样的:先是A的000001 开头的所有行,然后B的000001开头的所有行;然后A的000002开头的行,然后B的000002开头的……依此类推……

我能想到的一个思路需要用seek不停的打开关闭两个文件句柄,感觉很笨很麻烦……

各位能不能给个思路算法 :wink:
谢谢讨论

论坛徽章:
39
技术图书徽章
日期:2018-08-21 13:30:492015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34数据库技术版块每日发帖之星
日期:2015-12-01 06:20:00平安夜徽章
日期:2015-12-26 00:06:30技术图书徽章
日期:2018-08-21 13:30:242016科比退役纪念章
日期:2018-03-07 11:23:33
发表于 2012-10-16 18:16 |显示全部楼层
来2个比较笨的办法
用临时文件,
用内存hash/数组
AB文件都只需要打开一次吧

论坛徽章:
0
发表于 2012-10-16 19:09 |显示全部楼层
本帖最后由 飞鸿无痕 于 2012-10-16 19:12 编辑

回复 1# gaoyang636


    我觉得可以将A,B的内容都放到hash中,然后通过排序后将结果输出到文件即可,下面附上简单的代码,刚开始学习perl,有不对的地方请多指点。呵呵!不知道这么处理是否能达到你的要求。
  1. #!/usr/bin/perl
  2. use strict;
  3. use Data::Dumper;

  4. open CONFIG1, '<A';
  5. open CONFIG2, '<B';
  6. open CONFIG3, '>>C';

  7. my %test1;
  8. my $count=0;

  9. while(<CONFIG1>){
  10.         $_=~s/^/a /;
  11.         $test1{$count}=$_;
  12.         $count++;
  13. }

  14. while(<CONFIG2>){
  15.         $_=~s/^/b / ;
  16.         $test1{$count}=$_;
  17.         $count++;
  18. }

  19. foreach(sort sort_test keys %test1){
  20.         $test1{$_}=~s/^(a |b )//;
  21.         print CONFIG3 $test1{$_};
  22. }

  23. close CONFIG1;
  24. close CONFIG2;
  25. close CONFIG3;

  26. sub sort_test{
  27.         substr($test1{$a},2,6) <=> substr($test1{$b},2,6)
  28.         or substr($test1{$a},0,1) cmp substr($test1{$b},0,1);
  29. }
复制代码
我这边的环境为:
  1. [root@puppet test]# cat A
  2. 000001 blabla
  3. 000001 gagaga
  4. 000001 cacacac
  5. 000002 qiaqia
  6. 000002 hahaha
  7. 000003 miamia
  8. [root@puppet test]# cat B
  9. 000001 blablacccf
  10. 000001 gagagaccccc
  11. 000001 cacacaccccc
  12. 000002 qiaqiacccc
  13. 000002 hahahacccc
  14. 000003 miamiacccc
复制代码
处理结果为:
  1. [root@puppet test]# cat C
  2. 000001 cacacac
  3. 000001 gagaga
  4. 000001 blabla
  5. 000001 blablacccf
  6. 000001 gagagaccccc
  7. 000001 cacacaccccc
  8. 000002 qiaqia
  9. 000002 hahaha
  10. 000002 qiaqiacccc
  11. 000002 hahahacccc
  12. 000003 miamia
  13. 000003 miamiacccc
复制代码

论坛徽章:
0
发表于 2012-10-16 19:50 |显示全部楼层
回复 3# 飞鸿无痕


    拜读了!果然直观简洁!思路很好,佩服佩服   
多谢你的帮助!

论坛徽章:
0
发表于 2012-10-17 08:49 |显示全部楼层
回复 1# gaoyang636


    使用数组的哈希就可以实现了
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;

  5. @ARGV = qw( A B );
  6. my %hash;
  7. while (<>) {
  8.     my @fields = split;
  9.     push @{ $hash{ $fields[0] } }, $_;
  10. }

  11. foreach my $f ( sort keys %hash ) {
  12.    print foreach @{ $hash{$f} };
  13. }
复制代码

论坛徽章:
0
发表于 2012-10-17 09:17 |显示全部楼层
回复 5# kk861123


    短小精悍 :wink: 就等这种的脚本来着~~谢谢

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
发表于 2012-10-17 10:15 |显示全部楼层
本帖最后由 mcshell 于 2012-10-17 10:16 编辑

回复 1# gaoyang636
  1. [root@mysqlmaster perl]# perl -alne '{push @{$hash{$F[0]}},$_}END{map{map{print $_} @{$hash{$_}}}keys %hash}' a  b
  2. 000001 blabla
  3. 000001 gagaga
  4. 000001 cacacac
  5. 000001 blablacccf
  6. 000001 gagagaccccc
  7. 000001 cacacaccccc
  8. 000002 qiaqia
  9. 000002 hahaha
  10. 000002 qiaqiacccc
  11. 000002 hahahacccc
  12. 000003 miamia
  13. 000003 miamiacccc
复制代码

论坛徽章:
0
发表于 2012-10-17 11:21 |显示全部楼层
回复 5# kk861123


    脚本短小精悍,佩服佩服!

论坛徽章:
0
发表于 2012-10-18 08:36 |显示全部楼层
回复 7# mcshell


    浓缩成一句话啦

论坛徽章:
1
15-16赛季CBA联赛之北控
日期:2016-08-05 14:22:52
发表于 2012-10-18 14:11 |显示全部楼层
学习了,数组的哈希
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP