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

ここでは配列のハッシュ (HoA) を使用します。

ファイルを最初にループして、各行を空白で分割します。\s. 次に、列 A の値を取得してこれをハッシュ キーとして使用し、プッシュ関数を使用して列 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 に答える