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

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

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

入力する:

abc
abc
def
abc
abc
def

予想出力:

abc
def
abc
def

答え1

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

uniq your-file

いくつかのuniq実装(例:GNU)uniqは、一連の行の最初の行を提供します。同じソートstrcoll()0を返す)の代わりにバイトはバイトと同じです。(ここmemcmp()またはstrcmp()0を返します)。実装に関係なくバイト間比較を強制するには、uniq次のロケールを強制的に適用できますC

LC_ALL=C uniq your-file

答え2

Vimはこれをとてもよく行います。

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

あるいは、vimをコマンドラインツールとして使用したい場合は、次のことができます。

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

そうすれば、後でvimを終了する必要はありません。 ;)

説明する:

:g/

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

\v^(.*\n)\1

すべての行はそれ自体につながります...

/d

ジャンプしたDeleteコマンド(現在行を削除)変更を保存して終了するだけです-c "wq"

答え3

これはawk同じです:

awk 'p!=$0; {p=$0}' file

p!=$0;前の行と異なる場合は、;ここに印刷行が必要です。現在の行に{p=$0}設定します。p

最初の行が空の場合、最初の行が欠落しているという明白なエラーがあります。簡単な修正は次のとおりです。

awk 'NR==1 || p!=$0; {p=$0}' file

関連情報