特定の条件が満たされたときに awk を使用して行セットを削除する方法

特定の条件が満たされたときに awk を使用して行セットを削除する方法

ファイルから重複した項目を削除するために使用しています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

重複行を削除しましたが、前の行と次の行を削除する方法はわかりません。

ベストアンサー1

あなたが本当に望むのは、<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>

おすすめ記事