免费注册 查看新帖 |

Chinaunix

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

求助!!!perl的多文件合并问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-06-27 09:09 |只看该作者 |倒序浏览
我现在有288个文件,文件格式如下
gene_number  position  snp
   num_1              1         a
   num_2              2         g
   num_3              3         c
      ...                 ...        ...
现在我要把这288个文件合并在一个文件中,并且要去掉重复的,合并后文件格式如下
gene_number  position  file_snp1    file_snp2   ...
   num_1              1         a                 g
   num_2              2         g                 c
   num_3              3         c                 a
      ...                 ...        ...                ...
用perl如何实现?

论坛徽章:
0
2 [报告]
发表于 2015-06-27 21:27 |只看该作者
以下供参考。把288个文件(后缀.txt)和这个程序放到一个文件夹中,cd到该文件夹后,运行程序即可。
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use File::Basename;

  5. my %data;
  6. my @files = glob "*.txt";
  7. for my $file (@files) {
  8.         my $file_name = basename ($file);
  9.         open my $fh, '<', $file or die $!;
  10.         while (<$fh>) {
  11.                 next if /^\s*$/;
  12.                 next if /^gene_number/;
  13.                 chomp;
  14.                 my ($num, $pos, $snp) = split;
  15.                 $data{$num}{$pos}{$file_name} = $snp;
  16.         }
  17.         close $fh;
  18. }

  19. print "gene_number\tposition";
  20. for my $file (sort @files) {
  21.         my $file_name = basename ($file);
  22.         print "\t$file_name";
  23. }
  24. print "\n";

  25. for my $num (sort keys %data) {
  26.         for my $pos (sort keys %{$data{$num}}) {
  27.                 print "$num\t$pos";
  28.                 for my $file (sort @files) {
  29.                         my $file_name = basename ($file);
  30.                         if (exists $data{$num}{$pos}{$file_name}) {
  31.                                 print "\t$data{$num}{$pos}{$file_name}";
  32.                         } else {
  33.                                 print "\tNA";
  34.                         }
  35.                 }
  36.                 print "\n";
  37.         }
  38. }
复制代码

评分

参与人数 1信誉积分 +10 收起 理由
substr函数 + 10 很给力!赞一个!

查看全部评分

论坛徽章:
0
3 [报告]
发表于 2015-06-28 07:30 |只看该作者
谢谢大神。。。现在有一个问题,就是怎么输出到一个文件里面?(菜鸟多多包涵)还有就是输出结果中有重复的行的话,怎么去除重复的行?谢谢


   

论坛徽章:
0
4 [报告]
发表于 2015-06-28 07:37 |只看该作者
抱歉,看错了,重复的行已经去掉了,谢谢啦,我已经知道怎么输出到文件了,非常感谢,请收下菜鸟的膝盖

   

论坛徽章:
0
5 [报告]
发表于 2015-06-28 10:41 |只看该作者
大神,请问 $data{$num}{$pos}{$file_name} = $snp;是什么意思?哈希数组之间的嵌套吗?


   

论坛徽章:
0
6 [报告]
发表于 2015-06-28 10:51 |只看该作者
对,是哈希的嵌套。
回复 5# nanshanjin


   

论坛徽章:
0
7 [报告]
发表于 2015-06-28 17:05 |只看该作者
能具体解释一下是什么意思吗?我对这个有点不太懂,谢谢

   

论坛徽章:
0
8 [报告]
发表于 2015-06-28 20:17 |只看该作者
每一行的“基因号-位置-文件名”对应一个SNP值。

论坛徽章:
0
9 [报告]
发表于 2015-06-28 22:27 |只看该作者
学习了,谢谢


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP