我有一些看起来像这样的数据:
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;
我需要被推动以使其适应我的新目的。任何帮助或建议都是非常受欢迎的!
答案 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