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