次の行が同じ場合は行を削除します


15

どのsed / awkコマンドを使用できますか?sort -uすべてのインスタンスを削除するだけです

入力:

abc
abc
def
abc
abc
def

期待される出力:

abc
def
abc
def

回答:


36

それがuniq標準コマンドの目的です。

uniq your-file

いくつかのことに注意uniqGNUのような実装がuniqあなたのラインのシーケンスの最初与えるソート同じ(ここでstrcoll()は対照的に戻る0)バイト対バイト同一である(ここで、memcmp()又はstrcmp()0を返します)。uniq実装に関係なく、バイトごとの比較を強制するには、ロケールを次のように強制できますC

LC_ALL=C uniq your-file

7

Vimはこれをうまく実現できます。

:g/\v^(.*\n)\1/d

または、コマンドラインツールとしてvimを使用する場合は、次のように実行できます。

vim file -c "g/\v^(.*\n)\1/d" -c "wq"

この方法で、後でvimを終了する必要はありません;)

説明:

:g/

この正規表現に一致するすべての行で...

\v^(.*\n)\1

それ自体が続く任意の行...

/d

d eleteコマンドを実行します(現在の行を削除します)。-c "wq"変更内容を保存して終了しています。


少なくともvim 8.1.2112では、ファイルの最後の2行である重複行に対しては機能しないことに注意してください。また、3つの重複行のシーケンスから1つの重複のみを削除します。
ステファンシャゼラス

1
@StéphaneChazelasは、現在3行の場合に望ましい動作の仕様が不足していることを除いて、両方の方法で望ましい動作を確認できました。
D.ベンKnoble
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.