假设一个多行文本文件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
要完成这项工作,我需要在上面的代码中进行哪些更改?
答案 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
$