[英]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 ($1 =="baz" && counter<=2)
{print $0; counter=$((counter+1));}
else if ($1 =="baz" && counter>2)
{next;}
else
{print $0;}
}' | tac
我需要在上面的代碼中進行哪些更改才能使其正常工作?
您不能從Awk操縱或訪問Bash變量,而只能從Bash訪問C程序中的變量。
tac file |
awk '$1 =="baz" && ++counter<=2 {print; next}
$1 !="baz"' |
tac
$ tac file | awk '$1!="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
$
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.