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

时间:2019-02-07 11:34:01

标签: bash text awk reverse tac

假设一个多行文本文件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 ($1 =="baz" && counter<=2)
    {print $0; counter=$((counter+1));}
else if ($1 =="baz" && counter>2)
    {next;}
else
    {print $0;}
}' | tac

要完成这项工作,我需要在上面的代码中进行哪些更改?

3 个答案:

答案 0 :(得分:1)

除了可以从Bash访问C程序中的变量之外,还不能从Awk操作或访问Bash变量。

tac file |
awk '$1 =="baz" && ++counter<=2 {print; next}
     $1 !="baz"' |
tac

答案 1 :(得分:0)

$ tac file | awk '$1!="baz" || c++<2' | tac
foo bar
foo bar
foo bar baz
baz
baz qux quux
foo bar

答案 2 :(得分:0)

如果您想尝试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
$