web-dev-qa-db-ja.com

viで重複行を削除しますか?

エントリの長いリスト(各行に1つ)を含むテキストファイルがあります。これらの一部は重複しているため、重複を削除できるかどうか(可能であれば、どのように)を知りたいと思います。可能であれば、vi/vim内からこれを行うことに興味があります。

111
Sydius

ファイルのソートに問題がなければ、次を使用できます。

:sort u
231
Brian Carper

これを試して:

:%s/^\(.*\)\(\n\1\)\+$/\1/

自身の1つ以上のコピーが直後に続く行を検索し、単一のコピーに置き換えます。

ただし、試してみる前にファイルのコピーを作成してください。テストされていません。

26
Sean

コマンドラインから:

sort file | uniq > file.new
20
Kevin

awk '!x[$0]++' yourfile.txt順序を保持する場合(つまり、ソートは受け入れられません)。 vimから呼び出すには、:! に使える。

7
Rovin Bhandari
g/^\(.*\)$\n\1/d

Windowsで動作します。ただし、行は最初にソートする必要があります。

6
Bridgey

上記の2つの答えを組み合わせます。

go to head of file
sort the whole file
remove duplicate entries with uniq

1G
!Gsort
1G
!Guniq

削除された重複行の数を確認する場合は、前後にcontrol-Gを使用して、バッファーに存在する行数を確認します。

5
Jon DellOro

視覚ラインモードでラインを選択します(Shift+v)、次に:!uniq。それは、次々と来る重複のみをキャッチします。

3
derobert

UniqをVimLに実装する方法については、 プラグインがメンテナンスしている でUniqを検索してください。 Vimメーリングリストで提供されたさまざまな実装方法がわかります。

さもないと、 :sort uはまさに道です。

0
Luc Hermitte

このバージョンでは、連続する繰り返し行のみが削除されます。つまり、連続した繰り返し行のみを削除します。指定されたマップを使用して、関数は空白行の混乱を記録します。ただし、行の先頭に一致するようにREGEXを変更する場合は^また、重複した空白行も削除します。

" function to delete duplicate lines
function! DelDuplicatedLines()
    while getline(".") == getline(line(".") - 1)
        exec 'norm! ddk'
    endwhile
    while getline(".") == getline(line(".") + 1)
        exec 'norm! dd'
    endwhile
endfunction
nnoremap <Leader>d :g/./call DelDuplicatedLines()<CR>
0
SergioAraujo
:%s/^\(.*\)\(\n\1\)\+$/\1/gec

または

:%s/^\(.*\)\(\n\1\)\+$/\1/ge

これはあなたのための私の答えです、それは複数の重複した行を削除し、削除しないで1つだけを保持できます!

0
cn8341

私は使うだろう !}uniq、ただし空白行がない場合にのみ機能します。

ファイル内のすべての行に対して::1,$!uniq

0
Chris Dodd

これは両方の.csvおよび.txt

awk '!seen[$0]++' <filename> > <newFileName>

説明:コマンドの最初の部分は一意の行を出力し、2番目の部分、つまり中央の矢印は最初の部分の出力を保存するためのものです。

awk '!seen[$0]++' <filename>

>

<newFileName>

0
paul

Vi/vimを使用しない別の方法(非常に大きなファイルの場合)は、Linuxコマンドラインからsortおよびuniqを使用する方法です。

sort {file-name} | uniq -u
0
william-1066