perl在表中匹配元素

时间:2014-11-03 11:48:33

标签: 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

我的目的是检查每一列是否有一个元素(不同于“NO”个案例)两次显示(例如第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;

我需要被推动以使其适应我的新目的。任何帮助或建议都是非常受欢迎的!

1 个答案:

答案 0 :(得分: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