2016-10-10 15 views
1

これは基本的なことと思われますが、単純なやり方で配列を作成することなくそれを行うことはできません。 。行をグループ化し、perlでそれらを1行に連結する

a,x1 
a,x2 
a,x3 
b,x4 
c,x5 
c,x6 

これは非常に大きなグラフのエッジリストは次のとおりです。

は、私は、この形式のファイルを持っています。 私は次の形式に変換する必要があります。

a,x1 x2 x3 
b,x4 
c,x5 x6 

(これは、グラフの他の一般的な形式がある)perlでそれを行うための簡単な方法はありますか?すべての "a"と "b"がソートされているとみなすことができるので、新しい開始ノード(「b」と言う)に戻ると戻ることはありません(たとえば、 "a"から出て行くエッジはありません)。

アドバイスをいただければ幸いです。

答えて

1

最後の "from"ノードは、ループの繰り返しに耐えられる変数に保持してください。

#!/usr/bin/perl 
use warnings; 
use strict; 

my $last = q(); 
while (<>) { 
    chomp; 
    my ($from, $to) = split /,/; 
    if ($from ne $last) { 
     print "\n" x (1 != $.), $from, ','; 
     $last = $from; 
    } else { 
     print ' '; 
    } 
    print $to; 
} 
print "\n"; 

"\n" x (1 != $.)第1行目の前に改行が印刷されないようにします。

ワンライナーと同じ:

perl -aF, -ne 'chomp $F[1]; print "\n" x (1 != $.), "$F[0]," if $l ne $F[0]; 
       print " " x ($l eq $F[0]), $F[1]; $l = $F[0] }{ print "\n"' < input 
0

私は2つの段階でこれを行うと思います。 1つはデータを有用なデータ構造に、もう1つはデータを印刷することです。

私が選択したデータ構造は配列のハッシュです。ハッシュのキーなど、あなたの「A」、「B」と「C」で、値が「X1、 『X2』を含む配列への参照です

コードは次のようになります。

#!/usr/bin/perl 

use strict; 
use warnings; 
# We use modern Perl (specifically say())` 
use 5.010; 

my %edges; 

while (<DATA>) { 
    chomp; 
    my ($key, $val) = split /,/; 
    push @{$edges{$key}}, $val; 
} 

for (sort keys %edges) { 
    say join ',', $_, @{$edges{$_}}; 
} 

__DATA__ 
a,x1 
a,x2 
a,x3 
b,x4 
c,x5 
c,x6 
関連する問題