重複した段落を削除する方法

重複した段落を削除する方法

段落(空行で区切られた行グループ)を含むファイルが提供されます。同等の段落内で改行を維持する必要があります。重複した段落を削除する方法はありますかuniq

各段落を1行に直列化し、uniq結果を実行して逆シリアル化できるようです。より良い解決策はありますか?

入力する:

Paragraph1
continue
continue

...

Paragraph2
continue
continue

...

Paragraph1
continue
continue

...

Paragraph2
continue
continue

希望の出力:段落1と段落2が1つしかありません。

コマンドラインソリューションがより良いです。

答え1

ドキュメントを見ると、awk次のものが利用できるようです。

cat file.txt | awk 'BEGIN { RS = "\n\n+"; first = 1 } {if (!x[$0]++) { if (!first) {print ""}; print $0; first = 0} }'

簡単な説明:

  • 段落を区別するために、レコード区切り文字をRS"\n\n+" に設定しました。
  • この変数は、firstレコード間に改行を印刷するために使用されます。または、各 $0 の後に改行を印刷できますが、最後のレコードの改行を削除する方法はありません。
  • マップは、x以前に履歴を見たことがあるかどうかを計算するために使用されます。見たことがない場合にのみ記録を印刷します。
  • recordsでない場合は、firstレコード間に改行を印刷します。
  • 履歴を印刷します。
  • 偽に設定してくださいfirst

答え2

$ awk -v RS= -v ORS='\n\n' '!seen[$0]++' file
Paragraph1
continue
continue

...

Paragraph2
continue
continue

関連情報