我正在尝试合并列B中与列A关联的名称。所以基本上对于列A中具有相同组号的所有列,我想合并来自列B的名称,用逗号和空格分隔到另一个文件。
col A col B
group1 ashlyn
group3 brooke
group2 caleb
group1 cali
group2 darlene
group2 dixie
group3 daniel
group1 edward
group3 ethan
group2 felix
group2 francis
group1 gabriel
到
group1 ashlyn, cali, edward, gabriel
group2 caleb, darlene, dixie, felix, francis
group3 brooke, daniel, ethan
我试过这个
open FH, '<', 'file.txt' or die $!;
open FH2, '>', 'file2.txt' or die $!;
@array = <FH>;
foreach $item (@array){
($group, $name) = split/ /, $item;
print FH2 "$group $name";
}
答案 0 :(得分:1)
将数据存储到数组哈希数据结构中(请参阅perldsc):
use warnings;
use strict;
my %data;
while (my $item = <DATA>) {
my ($group, $name) = split /\s+/, $item;
push @{ $data{$group} }, $name;
}
for my $group (sort keys %data) {
print $group, ' ', join(', ', @{ $data{$group} }), "\n";
}
__DATA__
group1 ashlyn
group3 brooke
group2 caleb
group1 cali
group2 darlene
group2 dixie
group3 daniel
group1 edward
group3 ethan
group2 felix
group2 francis
group1 gabriel
答案 1 :(得分:1)
你想在这里使用Hash of Arrays(HoA)。
首先在你的文件上循环,在空格上分割每一行。 \s
。然后,您可以使用列A的值并将其用作哈希键,使用push函数将列B的值添加到数组中。最后使用join
函数制作逗号分隔列表。
还可以使用strict
和warnings
use strict;
use warnings;
use feature 'say';
open my $F1, '<', 'file.txt' or die "failed $!";
open my $F2, '>', 'file2.txt' or die "failed $!";
my %hash;
while (<$F1>) {
my($grp, $name) = split /\s+/;
push @{ $hash{$grp} }, $name;
}
for (sort keys %hash) {
say {$F2} "$_ ", join ', ', @{$hash{$_}};
}
或者您可以使用:
while (<$F1>) {
push @{ $hash{$1} }, $2 if /(\S+)\s+(\S+)/;
}
输出(file2
):
group1 ashlyn, cali, edward, gabriel
group2 caleb, darlene, dixie, felix, francis
group3 brooke, daniel, ethan