2015-07-02 72 views
0

我有兩個文件,並希望從兩個文件中找到匹配的字段1和2,並在字段1和2匹配時從第二個文件打印第三個字段。文件1的樣子:perl腳本找到匹配在兩個文件中的字段

#CHR BP                           
#1 9690639                          
#1 7338706                          
#1 7338707                          
#1 7338717 

文件2的樣子:

#1 10036 rs11928874 CT C 315.21 VQSRTrancheINDEL99.99to100.00AC=3;AF=0.063;AN=48;BaseQRankSum=0.297;DP=1469;FS=16.265;InbreedingCoeff=-0.0941;MLEAC=3;MLEAF=0.063;MQ=14.67;MQ0=0;MQRankSum=1.339 

我寫了下面的Perl腳本,它輸出太多的線不符合匹配條件:

my @loci; 
open IN, "highalt_results.txt"; 
while (<IN>) { 
    my @L = split; 
    next if m/CHR/; 
    push @loci, [ $L[0], $L[1] ]; 
} 
close IN; 

my $F = shift @ARGV; 
open IN, "$F"; 
while (<IN>) { 
    my @L = split; 
    next if m/#CHROM/; 
    foreach (@loci) { 
     if ($L[0] = ${$_}[0]) { 
      if ($L[1] = ${$_}[1]) { 
       print "${$_}[0] ${$_}[1] $L[2]\n"; 
       next; 
      } 
     } 
    } 
} 

有人能指出腳本出錯的地方嗎?

+0

可能重複[Perl:匹配兩個文件中的數據](http://stackoverflow.com/questions/30600286/perl-matching-data-in-two-files) – Kaz

回答

1

我認爲這將是您的錯誤是:

if ($L[0] = ${$_}[0]) { 
     if ($L[1] = ${$_}[1]) { 

的Equals是一個任務 - 所以永遠是正確的。您可能需要==。或者,也許eq爲基於字符串的比較。

更一般地說 - 我認爲有幾件事情你應該真正做到收緊你的代碼。

  • strict and warnings確實不錯。
  • 3參數open帶有詞法文件句柄很好open (my $input, "<", $filename) or die $!; - 這避免了在@ARGV上指定文件名的潛在問題。 (考慮一個名爲'>/etc/passwd'的文件)
  • 你真的應該檢查是否open成功。
  • 而且我可能會建議而不是在你的foreach循環中使用implict變量,因爲${$_}[0]不是特別好。使用->取消引用可以使代碼更好。

我可能會改寫,就像這樣:

use strict; 
use warnings; 

my @loci; 
open(my $loci_in, "<", "highalt_results.txt") or die $!; 
while (<$loci_in>) { 
    my ($start, $end) = split; 
    next if m/CHR/; 
    push @loci, [ $start, $end ]; 
} 
close $loci_in; 

my $filename = shift @ARGV; 
open(my $input, "<", $filename) or die $!; 
while (<$input>) { 
    next if m/#CHROM/; 
    my ($start, $end, $data) = split; 
    foreach my $pair (@loci) { 
     if ( $start == $pair->[0] 
      and $end == $pair->[1]) 
     { 
      print "$start $end $data\n"; 

     } 
    } 
} 
close($input); 
0

至少你有錯誤 如果($ L [0] = $ {$ } [0]){ 如果($ L [1] = $ {$} [1]){

您應該使用==或當量比較

請清除您的數據文件格式。我不能看到匹配的字段

相關問題