如何打印匹配的行以及行之前和之後的行?目前我有:在正則表達式匹配時打印匹配的行和行±1(1-liner)
perl -lane 'print if $F[3] > 100000 && $F[2] =~ /^C$/ && print $last; $last = $_'
,它能夠打印兩種匹配線與線之前 - 但是我不知道如何將行後。
如何打印匹配的行以及行之前和之後的行?目前我有:在正則表達式匹配時打印匹配的行和行±1(1-liner)
perl -lane 'print if $F[3] > 100000 && $F[2] =~ /^C$/ && print $last; $last = $_'
,它能夠打印兩種匹配線與線之前 - 但是我不知道如何將行後。
您可以從文件中讀取下一行直接使用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
您還可以使用seek
和tell
和倒帶回來一行重疊匹配:
#!/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);
以下句柄重疊匹配。 $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 = $_ }
'