Chinaaa123 发表于 2019-01-05 14:31

关于Perl根据相同列合并N个文件的内容

大家好,请教一个问题!望大家指点迷津...1.前提:在一个目录下有N个文件(文件类型一致),且每一个文件中都有两列,格式如下:
假设这是第一个文件的内容:
ID       value1
gene11
gene22
gene33
..
..
2.目的: 为了将这N个文件的内容根据相同ID(即第一列)合并在一起,最终格式是:
ID       value1 value2 .......valueN
gene11       2      ......      1
gene22       4      ......      10
gene33       6      ......      12
..      ..       ..      ......         ..
..      ..       ..      ......         ..

3.大体思路:是第一个文件和第二个文件比,第二个文件和第三个文件比,以此类推
for my $j(0 .. @files2-1){
        if(-e "$files2[$j]"){
                open my $input,$files2[$j] or (die "$!");
      while(<$input>){
            chomp;
            my($id1,$value1)=split/\t/;
            $hash{$id1}=$value1;
      }
    }
    if(-e "$files2[$j+1]"){
      open my $input2,$files2[$j+1] or (die "$!");
      while(<$input2>){
            chomp;
            my($id2,$value2)=(split/\t/,$_);
            if(exists ...){
                  print "$id2\t$hash{$id1}\t$value2\n"; 这个弊端就是只能得到两列
            }

      }
}
该如何才能得到在前一轮输出的列后面继续呢!
谢谢大家了!

hztj2005 发表于 2019-02-10 23:42

本帖最后由 hztj2005 于 2019-02-14 20:47 编辑

这个代码其实很简单,对于每个文件,用哈希key读出已有的value,把新文件的valueN拼接在后面,再写回哈希表。
全部文件处理完毕,输出哈希表就可以了。

2013fish 发表于 2020-01-13 21:51

如果perl 这么复杂,那一定的是错的。


3.大体思路:是第一个文件和第二个文件比,第二个文件和第三个文件比,以此类推
for my $j(0 .. @files2-1){
      if(-e "$files2[$j]"){
                open my $input,$files2[$j] or (die "$!");
      while(<$input>){
            chomp;
            my($id1,$value1)=split/\t/;
            $hash{$id1}=$value1;
      }
    }
    if(-e "$files2[$j+1]"){
      open my $input2,$files2[$j+1] or (die "$!");
      while(<$input2>){
            chomp;
            my($id2,$value2)=(split/\t/,$_);
            if(exists ...){
                  print "$id2\t$hash{$id1}\t$value2\n"; 这个弊端就是只能得到两列
            }

      }
}
该如何才能得到在前一轮输出的列后面继续呢!
谢谢大家了!
页: [1]
查看完整版本: 关于Perl根据相同列合并N个文件的内容