エントリの長いリスト(各行に1つ)を含むテキストファイルがあります。これらの一部は重複しているため、重複を削除することが可能かどうか(可能であれば、方法も)を知りたいのですが。可能であれば、vi / vim内からこれを行うことに興味があります。
エントリの長いリスト(各行に1つ)を含むテキストファイルがあります。これらの一部は重複しているため、重複を削除することが可能かどうか(可能であれば、方法も)を知りたいのですが。可能であれば、vi / vim内からこれを行うことに興味があります。
回答:
ファイルの並べ替えに問題がない場合は、次を使用できます。
:sort u
:%!uniq
、ファイルをソートせずに重複するエントリを削除するために使用します。
u
これを試して:
:%s/^\(.*\)\(\n\1\)\+$/\1/
自分自身の1つ以上のコピーが後に続く任意の行を検索し、1つのコピーに置き換えます。
ただし、試す前にファイルのコピーを作成してください。テストされていません。
コマンドラインから次のようにしてください:
sort file | uniq > file.new
:sort u
大きなファイルにぶら下がっていたため、承認された回答が機能しませんでした。これは非常に迅速かつ完全に機能しました。ありがとうございました!
'uniq' is not recognized as an internal or external command, operable program or batch file.
awk '!x[$0]++' yourfile.txt
順序を保持したい場合(つまり、ソートは受け入れられません)。vimから呼び出すために:!
使用できます。
g/^\(.*\)$\n\1/d
Windowsで動作します。ただし、最初に行をソートする必要があります。
aaaa
続いaaaabb
削除させていただきますaaaa
誤って。
上記の2つの答えを組み合わせます。
go to head of file
sort the whole file
remove duplicate entries with uniq
1G
!Gsort
1G
!Guniq
削除された重複行の数を確認したい場合は、前後にcontrol-Gを使用して、バッファーに存在する行数を確認します。
'uniq' is not recognized as an internal or external command, operable program or batch file.
視覚線モード(Shift+ v)で線を選択し、次に:!uniq
。これは、次々に来る重複のみをキャッチします。
このバージョンでは、連続している繰り返し行のみが削除されます。つまり、連続する繰り返し行のみを削除します。指定されたマップを使用すると、関数は空白行で混乱を招きます。ただし、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>
vi / vim(非常に大きなファイルの場合)を使用しない別の方法は、Linuxコマンドラインからsortとuniqを使用することです。
sort {file-name} | uniq -u