我有一个包含制表符分隔列的文件,如下所示:
TR1 “\ t” 的P0C134
TR2 “\ t” 的P0C133
TR2 “\ t” 的P0C136
现在我将它们分成两个数组(每个列值一个),然后将它们转换为哈希值,但我想删除重复项(此处为TR2),同时合并它们的右列值...类似于此TR2 => P0C133,P0C136 ......怎么可能?在perl中有没有任何功能呢?
for($i=0;$i<=scalar@s_arr;$i++)
{
if($s_arr[$i] eq $s_arr[$i+1])
{ push(@temp,$idx_arr[$i]); }
else
{
if(@temp eq "")
{ $s_hash{$s_arr[$i]}=$idx_arr[$i]; }
else
{
$idx_str=join(",",@temp);
$s_hash{$s_arr[$i]}=$idx_str;
@temp="";
}
}
}
这是我编写的代码,其中@s_arr存储左列值,而@idx_arr存储右列值
答案 0 :(得分:4)
你可以避免使用两个数组并一举执行你想要的东西,将左侧值作为哈希键处理并使其成为数组引用,然后将与该键相关的右侧值推送到isf上:
use warnings;
use strict;
use Data::Dumper;
my %hash;
while (<DATA>){
my ($key, $val) = split;
push @{ $hash{$key} }, $val;
}
print Dumper \%hash;
__DATA__
TR1 P0C134
TR2 P0C133
TR2 P0C136
输出:
$VAR1 = {
'TR1' => [
'P0C134'
],
'TR2' => [
'P0C133',
'P0C136'
]
};
答案 1 :(得分:0)
如果你想要相同的结构输出使用哈希哈希。
#!/usr/bin/perl
use warnings;
use strict;
my @arr = <DATA>;
my %hash;
foreach (@arr)
{
my ($k,$v) = split(/\s+/,$_);
chomp $v;
$hash{$k}{$v}++;
}
foreach my $key1 (keys %hash)
{
print "$key1=>";
foreach my $key2 (keys $hash{$key1})
{
print "$key2,";
}
print "\n";
}
__DATA__
TR1 P0C134
TR2 P0C133
TR2 P0C136
输出是:
TR2=>P0C136,P0C133,
TR1=>P0C134,