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
$
假设一个多行文本文件 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
$