2016-11-22 124 views
1

我有两个文件(每个两列,按标签拆分),我想根据第一列进行比较。如果第一列的值在两个文件上都相同,我想使用第二列值创建一个新文件。另外,请考虑FILE1第一列中的ID可以重复。基本上我有:如何比较两个文件的第一列,但得到第二个(使用Perl)

FILE1:

TRINITY_DN10001_c0_g1_i1  TRINITY_DN10001_c0_g1_TRINITY_DN10001_c0_g1_i1_g.84091_m.84091 
TRINITY_DN100032_c0_g2_i1 TRINITY_DN100032_c0_g2_TRINITY_DN100032_c0_g2_i1_g.20078_m.20078 
TRINITY_DN100032_c0_g2_i1 TRINITY_DN100032_c0_g2_TRINITY_DN100032_c0_g2_i1_g.42263_m.42263 
..... 
TRINITY_DN99985_c0_g1_i1  TRINITY_DN99985_c0_g1_TRINITY_DN99985_c0_g1_i1_g.21199_m.21199 

FILE2:

TRINITY_DN100007_c0_g1_i1 GO:0001071,GO:0003674 
TRINITY_DN100032_c0_g2_i1 GO:0000149,GO:0001775 
..... 
TRINITY_DN99997_c0_g1_i1 GO:0000166,GO:0001882 

我需要这样的:

TRINITY_DN100032_c0_g2_TRINITY_DN100032_c0_g2_i1_g.20078_m.20078 GO:0000149,GO:0001775 
TRINITY_DN100032_c0_g2_TRINITY_DN100032_c0_g2_i1_g.42263_m.42263 GO:0000149,GO:0001775 
..... 

,我认为这可以通过组合两个哈希表来完成Perl,在某种程度上类似于to this answer

但我对Perl很新,所以我完全不知道该怎么做。如果有人能够帮助修改以前的脚本(或以不同的方式解决这个问题),我将不胜感激。

在此先感谢! ☺

+0

每个文件第一列中的ID是否唯一? – simbabque

+0

Ops ...我没有考虑到这一点!你是对的。 FILE1在第一列中有一些ID重复。 FILE2没有这个问题。任何建议?谢谢! –

回答

0

这些文件有多大?它们是否足够小以适应内存?他们排序了吗?

假设其中一个文件足够小以适应内存,您可以读取该文件并将其散列 - key是第一列,value是第二列。然后,通读其他文件,检查散列是否存在,如果存在,则打印第二列(其中一个是来自散列的值)。

假设我们有$file1$file2,那$file1足够小,我们得到的是这样的:

open my $fh, '<', $file1 or die "Can't read $file1: $!"; 
my %file1 = map { split /\t/, $_, 2 } <$fh>; # this slurps in the file, be sure you can fit it all in memory multiple times over! 
close $fh; 
open $fh, '<', $file2 or die "Can't read $file2: $!"; 
while (<$fh>) { 
    my ($k, $v) = split /\t/, $_, 2; 
    if ($file1{$k}) { 
     print join("\t", $file1{$k}, $v), "\n"; 
    } 
} 

假设相同,但允许文件1有重复:

open my $fh, '<', $file1 or die "Can't read $file1: $!"; 
my %file1; 
while (<$fh>) { 
    my ($k, $v) = split /\t/, $_, 2; 
    push @{$file1{$k}}, $v; 
} 
close $fh; 
open $fh, '<', $file2 or die "Can't read $file2: $!"; 
while (<$fh>) { 
    my ($k, $v) = split /\t/, $_, 2; 
    if ($file1{$k}) { 
     print join("\t", $_, $v), "\n" for @{$file1{$k}}; 
    } 
} 

注输出将具有来自file1的重复键始终与file1的顺序相同。

+0

谢谢!你的答案(几乎)很好。有没有办法处理FILE1第一列中的重复ID? –

+0

如果file2没有重复项,则可以将其取消。或者,您可以逐行读入file1,并将值推送到键上。 – Tanktalus

+0

您正在添加额外的换行符输出。 –

相关问题