免费注册 查看新帖 |

Chinaunix

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

关于合并文件的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-11 16:49 |只看该作者 |倒序浏览
想请教大家一个问题,我现在有两个文件a和b,a和b的格式都是这样的,不同的数字对应不同的字母
13   r
24   l
39   o
04   i
而且a和b中可能有重复的部分,即a和b中,可能有相同的数字,但对应的字母不同。
现在则需要把它们合并成一个文件。如果一个数字对应多个字母则用&分开,并在第三列中列出它来自哪个文件夹,来自两个的话则用;分开。

不知道要怎么写,请各位高手帮帮忙,给段代码,谢谢了!

论坛徽章:
0
2 [报告]
发表于 2010-05-11 17:00 |只看该作者
建议给出示例数据和想要的结果~

论坛徽章:
0
3 [报告]
发表于 2010-05-11 17:05 |只看该作者
就比如说a中是             b:
32   fred                        42   len
45   lucy                        32   peter
47   tom                        99    lenka
23   marry                     23    terry
而想要的结果是
32    fred&peter      a;b
45    lucy                  a
47    tom                  a
23    marry&terry    a;b
99    lenka                b
42    len                    b

论坛徽章:
0
4 [报告]
发表于 2010-05-11 17:48 |只看该作者
  1. #!/usr/bin/perl


  2. my $file1 = "a.txt";
  3. my $file2 = "b.txt";
  4. my $file3 = "result.txt";

  5. my %data_a;
  6. my %data_b;
  7. my %keys;

  8. open (FH,$file1);
  9. while (<FH>) {
  10.         chomp;
  11.          my ($key,$value) = split(/\s+/,$_);
  12.          $keys{$key} = 1;
  13.          $data_a{$key}=$value;
  14. }
  15. close FH;

  16. open (FH,$file2);
  17. while (<FH>) {
  18.         chomp;
  19.          my ($key,$value) = split(/\s+/,$_);
  20.          $keys{$key} = 1;
  21.          $data_b{$key}=$value;
  22. }
  23. close FH;

  24. open(FH,">$file3");
  25. foreach my $key (sort keys %keys) {
  26.         if ($data_a{$key} && $data_b{$key}) {
  27.                  print FH "$key\t$data_a{$key}&$data_b{$key}\t$file1;$file2\n";
  28.          }
  29.          elsif ($data_a{$key}) {
  30.                  print FH "$key\t$data_a{$key}\t$file1\n";
  31.          }
  32.          elsif ($data_b{$key}) {
  33.                  print FH "$key\t$data_b{$key}\t$file2\n";
  34.          }
  35. }
  36. close FH;

  37. print "文件合并成功!";

  38. <STDIN>;
复制代码

论坛徽章:
0
5 [报告]
发表于 2010-05-11 17:54 |只看该作者
非常感谢!!

论坛徽章:
0
6 [报告]
发表于 2010-05-11 18:10 |只看该作者
我写的很罗嗦,不过也可以实现:
  1. open A,"a.txt";

  2. my %ahash;

  3. while ( <A> ) {
  4. chomp;
  5. my($anum,$aname)=split;
  6. $ahash{$anum}=$aname;
  7. }

  8. close A;

  9. open B,"b.txt";

  10. my %bhash;

  11. while ( <B> ) {
  12. chomp;
  13. my($bnum,$bname)=split;
  14. $bhash{$bnum}=$bname;
  15. }

  16. close B;

  17. open O,">hebing.txt";

  18. foreach my $akey(sort keys %ahash){
  19. foreach my $bkey(sort keys %bhash){
  20. if ($akey eq $bkey){
  21. print O $akey."\t".$ahash{$akey}.'&'.$bhash{$akey}."\ta\;b\n";
  22. delete $ahash{$akey};
  23. delete $bhash{$bkey};
  24. }
  25. }
  26. }

  27. foreach my $akey (keys %ahash){
  28. print O $akey."\t".$ahash{$akey}."\ta\n"
  29. }

  30. foreach my $bkey (keys %bhash){
  31. print O $bkey."\t".$bhash{$bkey}."\tb\n"
  32. }

  33. close O;
复制代码

论坛徽章:
0
7 [报告]
发表于 2010-05-11 18:35 |只看该作者
来个shell的
  1. [root@kenthy shell]awk 'NR==FNR{a[$1]=$2}NR>FNR{if(a[$1]){print $0"&"a[$1],"a;b";a[$1]=""}else print $0,"a"}END{for(i in a)if(a[i])print i,a[i],"b"}' b a
  2. 32 fred&peter a;b
  3. 45 lucy a
  4. 47 tom a
  5. 23 marry&terry a;b
  6. 99 lenka b
  7. 42 len b
复制代码

论坛徽章:
0
8 [报告]
发表于 2010-05-11 21:05 |只看该作者
懂了!谢谢!

论坛徽章:
0
9 [报告]
发表于 2010-05-12 09:45 |只看该作者
回复 4# iamlimeng


    请解释一下 定义my %keys; 作用,小弟有点不明白,请赐教。感谢

论坛徽章:
0
10 [报告]
发表于 2010-05-12 10:05 |只看该作者
本帖最后由 iamlimeng 于 2010-05-12 10:07 编辑
就比如说a中是             b:
32   fred                        42   len
45   lucy                  ...
shuigui56 发表于 2010-05-11 17:05



定义%key是为了获得KEY(我把数据的第一列,即上述数据的阿拉伯数字列定义为KEY)清单,因为这一列有重复,比如a,b文件中都有32,通过使用HASH赋值可以去除这种重复,保证只访问一次。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP