0

我正在尝试合并与列 A 关联的列 B 中的名称。所以基本上对于列 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";
}
4

2 回答 2

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
于 2013-09-10T18:45:40.507 回答
1

您想在此处使用数组哈希 (HoA)。

首先循环遍历您的文件,将每一行拆分为空格。\s. 然后,您可以获取 A 列的值并将其用作您的哈希键,使用push函数将 B 列的值添加到您的数组中。最后使用该join功能制作逗号分隔列表。

也使用strictwarnings

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
于 2013-09-10T18:51:42.323 回答