Shell-Script

滿足特定條件時如何使用 awk 刪除一組行

  • April 8, 2022

awk用來刪除文件中的重複項,問題是如果找到重複項,我想刪除一組行,例如-

<p>
This is duplicate.
</p>
<p>
This is original.
</p>
<p>
This is duplicate.
</p>

我想把它改成——

<p>
This is duplicate.
</p>
<p>
This is original.
</p>

當一行重複時,刪除上一行和下一行,我們將不勝感激。

我目前正在使用-

awk -i inplace '!seen[$0]++' name_of_file

刪除重複的行,但我無法弄清楚如何刪除上一行和下一行。

我認為您真正想要做的是刪除重複<p>...</p>的分隔記錄而不是單獨的行。鑑於您發布的範例,GNU awk 就是這樣(您已經將其-i inplace)用於多字元 RS:

$ awk 'BEGIN{RS=ORS="</p>\n"} !seen[$0]++' file
<p>
This is duplicate.
</p>
<p>
This is original.
</p>

請注意,無論<p>...</p>記錄中有多少行,這都有效,例如,給定此輸入,其中重複記錄是多行:

$ cat file
<p>
This
is
duplicate.
</p>
<p>
This is original.
</p>
<p>
This
is
duplicate.
</p>

該腳本仍會刪除重複項:

$ awk 'BEGIN{RS=ORS="</p>\n"} !seen[$0]++' file
<p>
This
is
duplicate.
</p>
<p>
This is original.
</p>

引用自:https://unix.stackexchange.com/questions/698305