2013-08-06 32 views
0

我遇到了一件很简单的事情。我需要比较两个文件,并只写出两者之间不匹配的模式。使用perl编写两个文件之间不匹配的元素

我的第一个文件是这样的:

1 A A 
2 A B 
3 C D 
4 E F 
5 G H 
6 I L 

我的第二个文件是这样的:

A A 
A B 
C D 

我想要什么是使用对列表中的第二个文件,选择不匹配第一个文件中的行并将其输出到输出中。我想要的输出如下所示:

4 E F 
5 G H 
6 I L 

我的代码如下需要改进,我需要您的帮助来做到这一点!

open (FUS, "< $file_1")|| die "Impossible open file 1"; 
@f = <FUS>; 
close (FUS); 

open (ALL, "< $file_2")|| die "Impossible open file 2"; 
@a = <ALL>; 
close (ALL); 

for ($c=0; $c<=$#a; $c++) { 
    chomp ($a[$c]); 
    @q = split (/\t/, $a[$c]); 
    $qok = $q[0]."\t".$q[1]; 
    $qko = $q[1]."\t".$q[0]; 

    for ($t=0; $t<=$#f; $t++) { 
     chomp ($f[$t]); 
     ($id, $pf1, $pf2) = split (/\t/, $f[$t]); 
     $pf_12 = $pf1."\t".$pf2; 
     $pf_21 = $pf2."\t".$pf1; 

     if ((($qok ne $pf_12) && ($qko ne $pf_12)) || (($qok ne $pf_21) && ($ko ne $pf_21))){ 
      print "$id\t$pf1\t$pf2\n"; 
     } 
    } 
} 

该代码的问题是循环中的问题,使我得到一个错误的结果,而不是所需的。

任何建议都非常欢迎!

+0

'grep -v -f file1 file2'或者类似的东西?哦,我的天哪,你的变数名称令人困惑。你怎么忍受它? '$ qok $ qko $ c $ q $ pf1 $ pf2 $ pf_12 $ pf_21' ... – TLP

回答

5

这是很容易做到与grep,如果你愿意:

$ grep -Fvf b.txt a.txt 
4 E F 
5 G H 
6 I L 

-F表示“固定字符串”,-v表示“反向匹配”,-f表示“从文件读取模式,每行一个”。

+0

非常简单的解决方案!谢谢!! – Gabelins

1

通常的方式实现这一目标是到第二个文件存储在哈希

open my $ALL, '<', $file_2 or die "$file_2 : $!"; 

my %hash; 
while (<$ALL>) { 
    chomp; 
    $hash{$_} = 1; 
} 

open my $FUS, '<', $file_1 or die "$file_1 : $!"; 
while (<$FUS>) { 
    my ($columns) =/(.*)/; 
    print unless exists $hash{$columns}; 
} 
+0

'undef $ hash {$ _}'?这是一种不寻常的方式来标记现有的东西。 – TLP

+0

@TLP:它只是创建没有任何价值的密钥。在旧版本的Perl中,它也使得散列更小。 – choroba

+0

是的,我理解这个原理,但是在这种情况下,可读性对于小的优化来说更可取。 – TLP

1

如果你的文件不是太大,我建议使用散列:

1 )使用键作为字符串所需的匹配部分来填充%hash_a。读取文件后,该散列都会有这样的内容:

%hash_a = (
'A A' => '1 A A', 
'A B' => '2 A B', 
... 
'I L' => '6 I L' 
); 

2)第二个文件迭代,并从%hash_a删除正确的密钥:

$key =<$file>; 
chomp $key; 
delete $hash_a{$key}; 

3)上打印剩余键%hash_a

另外,我建议你:

  • 把这个在你的脚本的开头:
use strict; 
use warnings; 
  • 使用现代的方法来处理文件:
open my $FUS, '<', $file_1 or die "Cannot open $file_1: $!"; 
相关问题