2016-10-10 58 views
1

這似乎是一個基本的事情要做,但我不能找出一個簡單的方法做到這一點,而不需要開始構建大量的數組等等,所以如果這太簡單了,我很抱歉。分組行並將它們連成一行perl

我有這個格式的文件:

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

只要將最後一個「從」節點保存在循環迭代中存在的變量中即可。

#!/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

我做這兩個階段。一種是將數據轉換爲有用的數據結構,另一種是打印數據。

我選擇的數據結構是數組散列。散列的鍵是你的「一個」,「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 
相關問題