空の行を維持しながら、awkで重複行を削除するにはどうすればよいですか?


13

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

awk '!seen[$0]++'

テキストに空行が含まれている場合、1行を除くすべての空行が削除されます。

のみを使用して、空ではないすべての重複行を削除しながら、すべての空の行を保持するにはどうすればよいawkですか?また、簡単な説明も含めてください。

回答:


28

別のオプションは、チェックすることですNF、例えば:

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

11

代わりに

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

主なトリックは同じで、キーが現在の行()seen[$0]++であるseen連想配列にエントリを作成します$0。したがって、!seen[$0]++この行が既に表示されている場合はfalseになります。/./そう、行は任意の非空白文字が含まれているかどうかをチェックしている!/./非空白行と一致します。|| !seen[$0]++それと組み合わせて 、空白行を除くすべての重複行を無視し、残りを印刷します。


これは受け入れられた答えであるべきだと思います。説明のために+1!
SSアン

5
awk '/^[[:blank:]]*$/ { print; next; }; !seen[$0]++'

あなたがしなければならないのは、最初に空の(本当に空の、または単に空の)行をチェックするだけです。


5

awk@Thorの答えに似た別のソリューションを次に示します。簡潔ではありませんが、より効率的です。

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

これにより、a[$0]存在するかどうかのみをチェックします。そうでない場合は、初期化してから印刷します。この場合、参照、a[$0]存在する場合の割り当てはありません。


288行のテストファイルでは、大きな時間差を測定しませんでした。ただし、コードは間違いなく最も読みやすいという賞を獲得しています。
セルジュStroobandt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.