免费注册 查看新帖 |

Chinaunix

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

请教一个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-25 16:04 |只看该作者 |倒序浏览
有两个文件A,B。两个文件中都有两列 id ,name

A文件

abc   123
vff      456

B文件

abc   789
poi    100

如果B文件中的id列在A文件中有就生成一个新文件在id,name列,后面再追加一列之值为C
如果B文件中的id列在A文件中没有就在新文件中id,name列,后面再追加一列之值为A
如果A文件中的id列在B文件中没有就在新文件中id,name列,后面再追加一列之值为D

例如上面的A,B文件生成的新文件
C文件

abc   123    C
vff      456    D
poi    100     A

上面文件之间的分隔符是Tab键

请问大家有什么简单的实现方法么

论坛徽章:
0
2 [报告]
发表于 2006-02-25 16:46 |只看该作者
原帖由 mayong801030 于 2006-2-25 16:04 发表
有两个文件A,B。两个文件中都有两列 id ,name

A文件

abc   123
vff      456

B文件

abc   789
poi    100

如果B文件中的id列在A文件中有就生成一个新文件在id,name列,后面再追加一列之值为C ...


产生的新文件c的内容,到底是以a为准还是以b为准呢?偶听你的意思是前2种以b为准,第3种以a为准。
这个用shell也可以写,但偶想用perl似乎更简单些?随手写一个仅供参考:

  1. #!/usr/bin/perl
  2. use strict;

  3. my (%hashA,%hashB);
  4. open (A,"a") or die $!;
  5. $hashA{(split)[0]} = $_ while(<A>);
  6. close A;
  7. open (B,"b") or die $!;
  8. $hashB{(split)[0]} = $_ while(<B>);
  9. close B;

  10. open (C,">>","c") or die $!;
  11. for (keys %hashB){
  12.     if ($hashA{$_}){
  13.         chomp $hashB{$_};
  14.         print C "$hashB{$_} C\n";
  15.     }else{
  16.         chomp $hashB{$_};
  17.         print C "$hashB{$_} A\n";
  18.     }
  19. }
  20. for (keys %hashA){
  21.     unless ($hashB{$_}){
  22.         chomp $hashA{$_};
  23.         print C "$hashA{$_} D\n";
  24.     }
  25. }
  26. close C;
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
3 [报告]
发表于 2006-02-25 21:02 |只看该作者
awk版:
  1. awk 'FILENAME=="A" {
  2.   a[$1]=$2 FS "D";}
  3. FILENAME=="B" {
  4.   if (a[$1]) sub(/D$/, "C", a[$1])
  5.   else a[$1]=$2 FS "A";}
  6. END{
  7.   for (i in a) print i, a[i];}' A B >C
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP