0

私のファイルは次のようになります。

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

一致したパターンが 6 行目で 30 の場合、たとえば N=3 で M=4 の場合、6 行目の前の N 行と M 行後の M 行を取得したいので、結果は次のようになると予想されます。

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";
}
}
4

2 に答える 2

1

@preceding最後に読み取った行の配列 (と呼びます) を維持しNます。パターンが一致したら、この配列の更新を停止し、別の配列への行の挿入を開始します ( @following)。線が入る@followingまでこれを行います。M

次のようになります (ikegami のおかげで修正されました)。

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/;
}
于 2013-05-06T02:17:07.810 に答える