2016-10-10 3 views
1

이것은 기본 작업처럼 보입니다. 그러나 너무 많은 배열 등을 시작하지 않고 간단한 방법으로 알아낼 수 없습니다. 너무 간단하면 사과드립니다. .줄을 그룹화하고 perl에서 한 줄로 연결

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

이 매우 큰 그래프의 에지 목록은 다음과 같습니다

나는이 형식의 파일이 있습니다. 나는 다음과 같은 형식으로 변환해야합니다

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

(이 그래프의 또 다른 일반적인 형식은) 펄에 그 일을하는 간단한 방법이 있나요? 모든 "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 != $.) 첫 줄 앞에 줄 바꿈이 인쇄되지 않도록합니다.

한 라이너와 동일 :

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

내가 두 단계로이 작업을 수행 할 것입니다. 하나는 유용한 데이터 구조로 데이터를 가져오고 다른 하나는 데이터를 인쇄하는 것입니다.

내가 선택한 데이터 구조는 배열의 해시입니다. 해시의 키는 'A', 'B'와 'C'이며, 값은

코드는 다음과 같습니다 등 '1 개,'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 
관련 문제