2013-05-06 5 views
0

내 파일은 다음과 같습니다Perl에서 행을 일치시킨 후 여러 행을 가져 오는 방법은 무엇입니까?

1 15 
2 16 
3 18 
4 19 
5 25 
6 30 
7 55 
8 45 
9 34 
10 52 

일치하는 패턴이 라인 6 (30)의 경우, 내가 예를 들어, 6 행 후 전 N 라인과 M 라인을 잡아하고자하는 경우 N = 3, M = 4 결과는 다음과 같을 것으로 예상됩니다 :

3 18 
4 19 
5 25 
6 30 
7 55 
8 45 
9 34 
10 52 

저는 Perl에서 매우 새로운 초보자입니다.

# UPDATE 아래의 유용한 조언을 주셔서 감사 드리며 정말로 감사드립니다. 여기에 대한 내 업데이트 된 코드 및 모든 제안을 환영합니다!

my $num; 

while(<>) 
{ 
if (/pattern/) 
{$num = $. ;} 
} 

open (,"") || die ("Can't open the file"); 

while(<>) 

{ 
if ( $. >= $num-N and $. <=$num+M) 
{  
print OUT "$_ \r"; 
} 
} 
+2

서로 4 줄로 두 개의 일치 항목을 찾을 수 있습니까? 그렇다면 무엇을? – ikegami

+0

학습 과제로이 작업을 수행하지 않는 한 ack 또는 grep : 'ack'30 '- before-context 3 --after-context 4 DATA_FILE을 고려할 수 있습니다. – FMc

+0

@FMc 감사와 grep에 대한 귀하의 조언에 많은 감사 드리며 정말로 감사드립니다. 이것은 perl에서 학습 한 유일한 연습입니다. – Sam

답변

1

배열을 유지 지난 N 라인 읽기 (나는 그것을 @preceding 전화 할게). 패턴이 일치하면이 배열의 업데이트를 중지하고 다른 배열에 행을 삽입하기 시작합니다 (@following). @followingM 행이있을 때까지이 작업을 수행하십시오. 그 정확한 목적을 위해 -A와

my $matched = 0; 
my @preceding; 
my @following; 
while(<>){ 
    if ($matched){ 
     push (@following, $_); 
     last if @following == M; 
     next; 
    } 
    else { 
     push (@preceding, $_); 
     shift(@preceding) if @preceding > N; 
    } 
    $matched = 1 if /pattern/; 
} 
+0

많은 감사드립니다. 그러나 나는 여전히 위의 코드를 사용하여 필요한 데이터를 인쇄하지 못했습니다. (나중에 시도 할 것입니다. – Sam

+0

@Sam 인쇄하려면 앞뒤의 내용을 인쇄하십시오. –

0
my @lines = <>; 
foreach $idx (grep { $lines[$_] =~ /pattern/ } 0..$#lines) { 
    print join (map {$lines[$_]} grep { $_ >= $idx - $B && $_ <= $idx +$A } 0..$#lines)."\n"; 
} 

당신은 또한 GNU의 grep 명령을 사용할 수 있습니다, -B 플래그 :

그것은이 같은 (고정 이케 가미 지금 덕분에) 보일 것입니다.

-A NUM, --after-context=NUM 
      Print NUM lines of trailing context after matching lines. 
      Places a line containing -- between contiguous groups of 
      matches. 

    -B NUM, --before-context=NUM 
      Print NUM lines of leading context before matching lines. 
      Places a line containing -- between contiguous groups of 
      matches. 
+0

나에게 건설적이고 도움이되는 아이디어를 준다! 정말로 감사한다! – Sam

관련 문제