2013-07-30 40 views
0

我想比較一個文件(file1)中列(col1)的值與另一個文件(file2)中列(col1)的所有記錄。我的策略是讀取文件,對於文件中的每一行,通過製表符分隔符分割並比較兩列中的值。如果匹配,則從第二個文件的列中打印特定值並將其附加到第一個文件的最後一列,否則打印「未找到」並將其附加到第一個文件的最後一列。 我認爲我的下面的腳本是比較線條而不是線條到字段中的所有線條,並返回錯誤(使用未初始化的值$ col1 [0] ...)。 你會很感激。Perl中的字段/列比較

open (FILE1, "<", "file1") or die ("Can't open file $!"); 
open (FILE2, "<", "file2") or die ("Can't open file $!"); 
my @data1 = <FILE1>; 
my @data2 = <FILE2>; 
foreach my $curr_line_1 (@data1) { 
    my @col1 = split "\t", $curr_line_1; 
    } 
foreach my $curr_line_2 (@data2) { 
    my @col2 = split "\t", $curr_line_2; 
    } 
      if ("$col1[0]" eq "$col2[0]") { 
       open FINAL, '>>', 'final'; 
       push(@col1, "$col2[1]"); 
       print FINAL "@col1\n"; 
       } 
      else { 
       open FINAL, '>>', 'final'; 
       push(@col1, "not found"); 
       print FINAL "@col1\n"; 
       } 
close(FINAL); 
close(FILE1); 
close(FILE2); 

file1  
1 mary 
1 tom 
2 john 
3 will 
4 hugh 
5 eddy 

file2 
2 unit2 
3 unitA 
5 base 

final 
1 mary not found 
1 tom not found 
2 john unit2 
3 will unitA 
4 hugh not found 
5 eddy base 
+0

你的問題有點不清楚。 File1包含鍵和值的查找表。 File2包含數據行。您想要獲取File2中的每一行並在File1中查找某個列的值作爲關鍵字。如果發現你想將File1中相應的值附加到File2中的不同列;如果找不到,則希望將字符串「未找到」附加到File2中的同一列。它是否正確?如果您可以爲File1和File2提供一些示例數據以及預期輸出,那將會非常有幫助。 –

+0

你完全正確。我會馬上提供一些示例數據! – jamie

+0

你的'if'永遠是真的嗎? – toolic

回答

0

我不認爲你的第一個for循環做任何事情。看起來它只是設置一個變量,它是一個又一個循環的本地循環。你有'嚴格使用'嗎?當它遇到$ col1 [0]時應該會收到警告,因爲那時在該範圍內沒有具有該名稱的變量。也許,而不是使用循環,你可以不喜歡

my @data1_fields = map { [ split "\t", $_ ] } @data1; 

然後處理在第二循環中的比較。

編輯:事實上,第二個列表可能會更好作爲一個散列,然後,這將使一切更容易。假設file2中每一行的密鑰都是唯一的,也許試試這個(未經測試):

my %data2_hash =(); 
for (@data2) { 
    $data2_hash{$_[0]} = $_[1]; 
} 
for (@data1_fields) { 
    # this is bad style, but w/e 
    push(@{$_}, $data2_hash{$_[0]}) if exists $data2_hash{$_[0]}; 
} 
open FINAL, '>>', 'final'; 
for (@data1_fields) { 
    print FINAL join "\t", @{$_}; 
}