用perl 将两个文件合并,有相同ID的信息都列出来,一个没有的信息以NA替代

第一个文件ABCD10.310.420.150.2220.170.560.430.2750.210.450.590.7380.440.540.190.57100.320.... 第一个文件

A B C D
1 0.31 0.42 0.15 0.22
2 0.17 0.56 0.43 0.27
5 0.21 0.45 0.59 0.73
8 0.44 0.54 0.19 0.57
10 0.32 0.42 0.51 0.50
第二个文件
E F G
1 0.87 0.75 0.88
8 0.49 0.81 0.73
13 0.59 0.91 0.88
14 0.54 0.71 0.67

合并后成为:
A B C D E F G
1 0.31 0.42 0.15 0.22 0.87 0.75 0.88
2 0.17 0.56 0.43 0.27 NA NA NA
5 0.21 0.45 0.59 0.73 NA NA NA
8 0.44 0.54 0.19 0.57 0.49 0.81 0.73
10 0.32 0.42 0.51 0.50 NA NA NA
13 NA NA NA NA 0.59 0.91 0.88
14 NA NA NA NA 0.54 0.71 0.67
上述文件均以tab键隔开的。
展开
 我来答
阳光上的桥
推荐于2016-08-06 · 知道合伙人软件行家
阳光上的桥
知道合伙人软件行家
采纳数:21423 获赞数:65813
网盘是个好东东,可以对话和传文件

向TA提问 私信TA
展开全部

程序代码:

my(%d1,%d2,$str,$key,$val);
my($id,$a,$b,$c,$d,$e,$f,$g);
#读取文件1
open(FD,'1');
while(<FD>){
  chomp;
  ($id,$a,$b,$c,$d)=split(/\s+/);
  $d1{$id}="$a\t$b\t$c\t$d";
}
close(FD);
#读取文件2
open(FD,'2');
while(<FD>){
  chomp;
  ($id,$e,$f,$g)=split(/\s+/);
  $d2{$id}="$e\t$f\t$g";
}
close(FD);
#生成文件3
open(FD,'>3');
foreach $id (keys %d1){
  print FD "$id\t".$d1{$id}."\t".(exists($d2{$id})?$d2{$id}:"NA\tNA\tNA")."\n";
  delete($d2{$id}) if (exists($d2{$id}));
}
foreach $id (keys %d2){
  print FD "$id\t".(exists($d1{$id})?$d1{$id}:"NA\tNA\tNA")."\t".$d2{$id}."\n";
}
close(FD);

运行拷屏:

更多追问追答
追问
你运行的结果A、B、C、D和E、F、G怎么跑到两行去了?抬头也不对。
追答
你没有对你的文件拷屏,我不知道你的文件究竟什么样子,我不知道你能否理解程序以及稍微修改,你是否明白程序为什么是这样的结果

你有没有用程序对你的数据进行测试,结果怎样?如果你的数据第一行在A前面有个ID或者其它的内容,你能想到输出是什么结果吗?
百事牛
2024-10-28 广告
作为深圳奥凯丰科技有限公司的一员,对于zip删除文件的处理,我们可以这样回答:要打开zip压缩包中删除的文件,实际上需要首先明确文件是否真正从压缩包中移除了。如果文件已从zip中删除,那么就无法直接打开,除非有备份。但如果是指解压后删除了某... 点击进入详情页
本回答由百事牛提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式