Awk - 打印最后 n 个散布的包含关键字的行

Awk - Printing n last, interspersed lines containing keyword

假设一个多行文本文件 file,其中一些行以关键字 baz.

开头
$ cat file
foo bar
baz qux   # line to be deleted
foo bar
foo bar baz
baz
baz qux quux
foo bar

如何显示所有不以关键字开头的行以及 n 最后以关键字开头的行?

如果n=2,结果应该是这样的:

$ sought_command file
foo bar
foo bar
foo bar baz
baz
baz qux quux
foo bar

我相信 awk 可能是通往这里的道路。大致如下:

counter=1
tac file | awk '{
if ( =="baz" && counter<=2)
    {print [=12=]; counter=$((counter+1));}
else if ( =="baz" && counter>2)
    {next;}
else
    {print [=12=];}
}' | tac

我需要在上面的代码中更改什么才能使其正常工作?

您不能从 Awk 操作或访问您的 Bash 变量,就像您不能从 Bash.

访问 C 程序中的变量一样
tac file |
awk ' =="baz" && ++counter<=2 {print; next}
      !="baz"' |
tac
$ tac file | awk '!="baz" || c++<2' | tac
foo bar
foo bar
foo bar baz
baz
baz qux quux
foo bar

如果您想尝试 Perl,这里有一个独立的解决方案。

$ cat michael.txt
foo bar
baz qux   # line to be deleted
foo bar
foo bar baz
baz
baz qux quux
foo bar
$ perl -0777 -ne ' $x++ for(/^baz/gm); $y=$x-2; while( $y-- ) { s/^baz.+?\n//m } ; print ' michael.txt
foo bar
foo bar
foo bar baz
baz
baz qux quux
foo bar
$