2015-11-13 79 views

回答

4

您可以從文件中讀取下一行直接使用scalar <>

perl -lane 'print, print scalar <> 
       if $F[3] > 100000 && $F[2] =~ /^C$/ 
       && print $last; 
      $last = $_' input 

或者使用滑動窗口重疊的匹配:

perl -ane 'BEGIN { @b = map [], 1 .. 3 } 
      sub out { 
       shift @b; 
       if ($b[1][3] > 100_000 && $b[1][2] =~ /^C$/) { 
        print for map $_->[-1], @b; 
       } 
      } 
      push @b, [@F, $_]; 
      out() 
      }{ out() # Process the last line 
      ' input 
0

您還可以使用seektell和倒帶回來一行重疊匹配:

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

open my $fh ,'<', 'input' or die "unable to open file: $!\n"; 
my $last=""; 
while(<$fh>){ 
     my @b=split; 
     if(($b[3] > 100000) && ($b[2] =~ /^C$/)){ 
      print $last if $last; 
      print; 
      my $t=tell $fh; 
      print scalar <$fh>,"\n"; 
      seek $fh,$t,0; #rewind   
     } 
     $last=$_; 
} 
close($fh); 
1

以下句柄重疊匹配。 $N是匹配行之前和之後的行數。

perl -lane' 
    BEGIN { $N = 1 } 
    if ($F[3] > 100000 && $F[2] =~ /^C$/) { print for splice(@buf), $_; $next=$N } 
    elsif ($next) { --$next; print } 
    else { push @buf, $_; splice @buf, 0, -$N } 
' 

因爲我們知道$N = 1,我們可以簡化上述爲以下:

perl -lane' 
    if ($F[3] > 100000 && $F[2] =~ /^C$/) { print for splice(@buf), $_; $next=1 } 
    elsif ($next) { $next=0; print } 
    else { @buf = $_ } 
'