簡體   English   中英

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 ($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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM