合并这些数据

时间:2013-09-10 18:40:10

标签: perl

我正在尝试合并列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";
}

2 个答案:

答案 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函数制作逗号分隔列表。

还可以使用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