2014-09-25 47 views
5

我有兩個文件如下:如何找到兩個匹配的ID在兩個文件中,然後用自己的值來計算

文件#1

A 20.68 
B 17.5 
C 15.6 
D 20.6 
E 27.6 

文件#2

C 16.7 
X 2.9 
E 7.0 
A 15.2 

第一列是ID,第二列是得分。我試圖在兩個文件中找到匹配的ID,然後使用FILE#1中相應的分數計算FILE#2中的最終分數(Score2 - Score1)。以下是結果,我想:

輸出

C 1.1 
E -20.6 
A -5.48 

通過下面的代碼,我能得到匹配的ID,但我不知道如何調用從文件#2相應的分數做計算的FILE# 2。對你的幫助表示感謝!

open my $A, 'list1.txt'; 
open my $B, 'list2.txt'; 
my $h; 
map { chomp; $h{(split /\s+/)[0]} ++} <$A>; 


while (<$B>) { 
    my @split = split(/\s+/,$_); 
    my $ID = $split[0]; 
    my $score = $split[1]; 
    print "$ID\t$score\n" if $h{$ID}; 

} 

回答

1

您只需將您的第一個文件加載到密鑰值對的散列中即可。然後,當你迭代第二個文件時,你可以測試每個鍵是否存在於前一個文件中。

以下腳本將文件句柄打開到字符串以測試邏輯。但是,您可以輕鬆恢復爲打開活動腳本的文件。

use strict; 
use warnings; 
use autodie; 

my %score1 = do { 
    #open my $fh1, '<', 'list1.txt'; 
    open my $fh1, '<', \ "A 20.68\nB 17.5\nC 15.6\nD 20.6\nE 27.6\n"; 
    map {chomp; split ' ', $_, 2} <$fh1>; 
}; 

#open my $fh2, '<', 'list2.txt'; 
open my $fh2, '<', \ "C 16.7\nX 2.9\nE 7.0\nA 15.2"; 

while (<$fh2>) { 
    chomp; 
    my ($key, $score) = split ' '; 
    printf "%s %s\n", $key, $score - $score1{$key} if exists $score1{$key}; 
} 

輸出:

C 1.1 
E -20.6 
A -5.48 
+0

謝謝你,米勒。哈希是非常有用的。 – 2014-09-25 22:06:23

相關問題