免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(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:
谢谢讨论

论坛徽章:
42
19周年集字徽章-周
日期:2019-10-14 14:35:31平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2015-12-01 06:20:002015亚冠之首尔
日期: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:34IT运维版块每日发帖之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之新疆
日期:2016-06-07 14:10:01
2 [报告]
发表于 2012-10-16 18:16 |只看该作者
来2个比较笨的办法
用临时文件,
用内存hash/数组
AB文件都只需要打开一次吧

论坛徽章:
0
3 [报告]
发表于 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
4 [报告]
发表于 2012-10-16 19:50 |只看该作者
回复 3# 飞鸿无痕


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

论坛徽章:
0
5 [报告]
发表于 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
6 [报告]
发表于 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
7 [报告]
发表于 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
8 [报告]
发表于 2012-10-17 11:21 |只看该作者
回复 5# kk861123


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

论坛徽章:
0
9 [报告]
发表于 2012-10-18 08:36 |只看该作者
回复 7# mcshell


    浓缩成一句话啦

论坛徽章:
1
15-16赛季CBA联赛之北控
日期:2016-08-05 14:22:52
10 [报告]
发表于 2012-10-18 14:11 |只看该作者
学习了,数组的哈希
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP