2014-11-03 55 views
0

我有一些數據,看起來像這樣:匹配元素被Perl

G1 G2 G3 G4 
Pf1 NO B1 NO D1 
Pf2 NO NO C1 D1 
Pf3 A1 B1 NO D1 
Pf4 A1 NO C1 D2 
Pf5 A3 B2 C2 D3 
Pf6 NO B3 NO D3 

我的目的是在各列中,以檢查是否一個元素(從「否」的情況下不同)被顯示兩次(例如第2列中的A1),並且只有兩次(如果它顯示三次或更多,我不希望它在輸出中),並且如果是這樣,則將其寫爲與第一列的元素相對應。當然,我會有更多的列元素對應於第一列的元素。所以,期望的輸出如下所示:

Pf1 B1 
Pf2 C1 
Pf3 A1 B1 
Pf4 A1 C1 
Pf5 D3 
Pf6 D3 

我有一個代碼,工作方向相反。它列出了第一列的元素,它們對應於在其他列中顯示兩次並且只顯示兩次的元素。此代碼如下所示:

use Data::Dumper; 

my %hash; 
while (<DATA>) { 

    next if $.==1; 
    chomp; 
    my ($first,@others) = (split /\s+/); 
    for (@others){ 
     $hash{$_}.=' '.$first; 
    } 
} 

print Dumper \%hash; 

我需要推送它以適應我的新目的。任何幫助或建議是完全受歡迎的!

+0

你串連值到您的哈希值。嘗試改爲:'$ hash {$ _} ++;' 這將對元素進行計數,然後可以打印計數。 – Sobrique 2014-11-03 11:51:44

回答

1
my %hash; 
my @r; 
while (<DATA>) { 

    next if $.==1; 
    chomp; 
    my @t = grep $_ ne "NO", split; 
    push @r, \@t; 
    $hash{$_}++ for @t[1 .. $#t]; 
} 

for my $l (@r) { 
    my $k = shift @$l; 
    my @t = grep { $hash{$_} ==2 } @$l; 
    print "$k @t\n"; 
} 

__DATA__ 
    G1 G2 G3 G4 
Pf1 NO B1 NO D1 
Pf2 NO NO C1 D1 
Pf3 A1 B1 NO D1 
Pf4 A1 NO C1 D2 
Pf5 A3 B2 C2 D3 
Pf6 NO B3 NO D3 

輸出

Pf1 B1 
Pf2 C1 
Pf3 A1 B1 
Pf4 A1 C1 
Pf5 D3 
Pf6 D3 
+0

謝謝!它完美的作品! – Gabelins 2014-11-03 12:39:36