2014-01-25 27 views
-3

我有兩個文件「1.txt」和「2.txt」。Perl在兩個文件中的列比較

兩個文件的結構是:

Main_File1 Start End 
1   200 250 
2   310 340 

Main_File2 Start End 
1   200 250 
2   350 370 

我想寫一個Perl代碼,其輸出應該是兩個文件,即具有共同的「起點」和「終點」位置的列表中的一個文件和其他具有唯一「開始」和「結束」位置的文件。

回答

1

我想你已經有讀取這些文件的代碼,只需要解析出這些值並對其進行組織。

設計部分提供了一個對每個開始,結束對都唯一的密鑰,但並不難。由於開始和結束都是數字,這應該是很容易的:

our %matchups ; 

sub process 
{ 
    my ($lst_)= @_ ; 
    for (@$lst_) { 
    my ($strt,$endn)= /\d+\w+(\d+)\w+(\d+)/ ; 
    next unless $strt && $endn ; 
    my $key= "${strt}_$endn" ; 
    $matchups{$key}[0]= $_ ; 
    $matchups{$key}[1] ++ ; 
    } 
} 

sub outputmatch 
{ 
    my ($dest,$multi)= @_ ; 
    # open file 
    for (values %matchups) { 
    print $OUT $_->[0] if ($_->[1] > 1) == $multi ; 
    } 
} 

{ 
    process(@listfrom1txt) ; 
    process(@listfrom2txt) ; 

    outputmatch("common.txt", 1) ; 
    outputmatch("uniq.txt", 0) ; 
} 

所以在這裏我們做一個關鍵是start_end,然後我們建立這兩個元素的數組散列中的數據結構。第一個元素是原始行,第二個元素是我們看過此條目的次數。

如果一條線是唯一的,則計數將爲1;如果不是,那麼它將大於1

+0

感謝您的幫助。我能夠從中理解的是我們製作了一個關鍵的開始和結束對。但我的問題是我有兩個文件。如何比較一個文件的密鑰對與其他。 –

+0

哈希'%matchups'是你用'process()'提供的所有文件的合併。通過輸入兩個文件,您將擁有計數爲「1」(唯一)的行和具有計數爲「2」的行(兩個文件中都存在)。 – woolstar