awkを使用してすべての空行を維持しながら重複行を削除する方法は?

awkを使用してすべての空行を維持しながら重複行を削除する方法は?

次のawkコマンドは、すべての重複行を削除します。ここで説明されているように:

awk '!seen[$0]++'

テキストに空白行が含まれている場合は、空白行が 1 つだけ残り、すべて削除されます。

すべての空行を維持する方法また、空でない重複行をすべて削除し、awk? を使用します。簡単な説明も含めてください。

答え1

NF別のオプションは、次のように確認することです。

awk '!NF || !seen[$0]++'

または均等に:

awk '!(NF && seen[$0]++)'

答え2

または

awk '!/./ || !seen[$0]++' file

主なコツは同じです。キーが現在行()の連想配列seen[$0]++に項目を生成します。したがって、この行が見えたらそれは偽です。空白以外の文字が含まれていることを確認するために行を調べるので、空白以外の行が一致します。これと組み合わせると、空白行を除くすべての重複行を無視し、残りの行を印刷します。seen$0!seen[$0]++/./!/./|| !seen[$0]++

答え3

awk@Thorの答えと似ていますが、あまり簡潔ではなく効率的なもう1つの解決策は次のとおりです。

awk '!NF {print;next}; !($0 in a) {a[$0];print}' file

a[$0]この方法で存在するかどうかを確認してください。そうでない場合は、初期化して印刷してください。この場合、参照はなく、a[$0]存在を指定することもありません。

答え4

論理演算子NOTが角括弧の外に移動します。

awk '!(NF && seen[$0]++)'

関連情報