エントリの長いリスト (各行に 1 つ) を含むテキスト ファイルがあります。これらのいくつかは重複しており、重複を削除できるかどうか (可能であればその方法) を知りたいです。可能であれば、vi/vim 内からこれを行うことに興味があります。
14 に答える
ファイルの並べ替えに問題がない場合は、次を使用できます。
:sort u
これを試して:
:%s/^\(.*\)\(\n\1\)\+$/\1/
それは、それ自体の 1 つ以上のコピーが直後に続く任意の行を検索し、それを 1 つのコピーに置き換えます。
ただし、試す前にファイルのコピーを作成してください。それはテストされていません。
コマンドラインから次のようにします:
sort file | uniq > file.new
上記の2つの回答を組み合わせます。
go to head of file
sort the whole file
remove duplicate entries with uniq
1G
!Gsort
1G
!Guniq
削除された重複行の数を知りたい場合は、前後に control-G を使用して、バッファーに存在する行数を確認してください。
g/^\(.*\)$\n\1/d
Windowsで動作します。ただし、最初に行をソートする必要があります。
視線モード( Shift+ v)で線を選択し、 で選択します:!uniq
。これは、次々と来る重複のみをキャッチします。
Uniq を VimL に実装する方法については、私が管理しているプラグインで Uniq を検索してください。Vimメーリングリストで提供されたさまざまな実装方法が表示されます。
それ以外の場合:sort u
は、実際に行く方法です。
ファイル全体を並べ替え/一意にしたくない場合は、ビジュアルモードで一意にしたい行を選択してから、次のようにします:sort u
。
:%s/^\(.*\)\(\n\1\)\+$/\1/gec
また
:%s/^\(.*\)\(\n\1\)\+$/\1/ge
これはあなたへの私の答えです。複数の重複行を削除し、削除せずに1つだけを保持できます!
を使用します!}uniq
が、それは空白行がない場合にのみ機能します。
ファイル内のすべての行に次を使用します:1,$!uniq
。