免费注册 查看新帖 |

Chinaunix

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

请各位帮个忙,匹配多个文件输出对应信息 [复制链接]

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-11 15:52 |只看该作者 |倒序浏览
我现在有三个文件,第一个文件是:

  1. VAR       CHR   POS
  2. C->T     chr1   55299
  3. C->C    chr1    55299
  4. C->A    chr1  55290
复制代码
第二个文件是:

  1. rs10399749      chr1    55299   +       C/C     1.000   44      C/T     0       0       T/T     0       0       44
  2. rs10399749      chr1    55290   +       C/A     0.800   44      C/T     0.100       0       T/T     0.100       0       44
复制代码
第三个文件是:

  1. chr1_55299_C_C      0.0016  
  2. chr1_55299_C_T      0.0016  
复制代码
我想用第一个文件分别去匹配第二第三个文件,假如第一个文件和第二个文件的2、3列相同,匹配第二个文件中第4列之后的数据,转化第一个文件的->成/匹配,即C->T变成C/T,如果找到和第一个文件第一列相同的输出后面的数字~匹配后输出第二个文件对应列后面的数字到第一个文件后面,如第一个文件是C->T     chr1   55299,匹配第二个文件是rs10399749      chr1    55299   +      C/T     0   输出C->T     chr1   55299 0;第三个文件同样处理,转化第一个文件的->成_匹配,即C->T变成C_T,假如第一个文件的“第二列”_“第三列”_“第一列(转化后)“与第三个文件的第一列匹配,输出后面的数字到第一个文件后面。如果没有匹配输出”."(第二个文件打印出title“ham.fr"到行首,第三个文件打印出title“snp.fr"到行首)
各位大大 麻烦帮帮我 谢谢

我最后希望得到的结果:

  1. VAR       CHR   POS      ham.fr      snp.fr
  2. C->T     chr1   55299    0           0.0016
  3. C->C    chr1    55299   1.000     0.0016
  4. C->A    chr1  55290      0.800      .
复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2013-11-11 19:50 |只看该作者
回复 1# huang6894

  1. use strict;

  2. my %hash1;
  3. my %hash2;
  4. open(f1,"file1") or die "$!\n";
  5. open(f2,"file2") or die "$!\n";
  6. open(f3,"file3") or die "$!\n";
  7. while(<f2>){
  8.     my ($n,$m) = /(chr\S+)\s+(\d+)/;
  9.     $hash1{$n."#".$m} = {$_=~/([ATC]\/[ATC])\s+([\d.]+)/g};
  10. }
  11. close(f2);
  12. while(<f3>){
  13.         chomp;
  14.         my @line = split /_|\s+/,$_;
  15.         $hash2{$line[0]."#".$line[1]}{$line[2]."/".$line[3]}= $line[4];
  16. }
  17. close(f3);
  18. print Dumper \%hash1,\%hash2;
  19. while(<f1>){
  20.         chomp;
  21.         if (/^VAR/){
  22.                 print (join "\t",$_,"hamf.fr","snp.fr");
  23.                 print "\n" ;
  24.         }else{
  25.                 print $_,"\t";
  26.                 my @line = split /\s+|->/,$_;
  27.                 print $hash1{$line[2]."#".$line[3]}->{$line[0]."/".$line[1]}||0,"\t";
  28.                 print $hash2{$line[2]."#".$line[3]}{$line[0]."/".$line[1]}||0;
  29.                 print "\n";
  30.         }
  31. }
  32. close(f1);
复制代码

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
3 [报告]
发表于 2013-11-12 08:57 |只看该作者
回复 2# yinyuemi


        虽然最后使用python解决的~但是能学习到真的很感谢你
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP