エントリの長いリスト(各行に1つ)を含むテキストファイルがあります。これらの一部は重複しているため、重複を削除できるかどうか(可能であれば、どのように)を知りたいと思います。可能であれば、vi/vim内からこれを行うことに興味があります。
ファイルのソートに問題がなければ、次を使用できます。
:sort u
これを試して:
:%s/^\(.*\)\(\n\1\)\+$/\1/
自身の1つ以上のコピーが直後に続く行を検索し、単一のコピーに置き換えます。
ただし、試してみる前にファイルのコピーを作成してください。テストされていません。
コマンドラインから:
sort file | uniq > file.new
awk '!x[$0]++' yourfile.txt
順序を保持する場合(つまり、ソートは受け入れられません)。 vimから呼び出すには、:!
に使える。
g/^\(.*\)$\n\1/d
Windowsで動作します。ただし、行は最初にソートする必要があります。
上記の2つの答えを組み合わせます。
go to head of file
sort the whole file
remove duplicate entries with uniq
1G
!Gsort
1G
!Guniq
削除された重複行の数を確認する場合は、前後にcontrol-Gを使用して、バッファーに存在する行数を確認します。
視覚ラインモードでラインを選択します(Shift+v)、次に:!uniq
。それは、次々と来る重複のみをキャッチします。
UniqをVimLに実装する方法については、 プラグインがメンテナンスしている でUniqを検索してください。 Vimメーリングリストで提供されたさまざまな実装方法がわかります。
さもないと、 :sort u
はまさに道です。
このバージョンでは、連続する繰り返し行のみが削除されます。つまり、連続した繰り返し行のみを削除します。指定されたマップを使用して、関数は空白行の混乱を記録します。ただし、行の先頭に一致するように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>
:%s/^\(.*\)\(\n\1\)\+$/\1/gec
または
:%s/^\(.*\)\(\n\1\)\+$/\1/ge
これはあなたのための私の答えです、それは複数の重複した行を削除し、削除しないで1つだけを保持できます!
私は使うだろう !}uniq
、ただし空白行がない場合にのみ機能します。
ファイル内のすべての行に対して::1,$!uniq
。
これは両方の.csv
および.txt
awk '!seen[$0]++' <filename> > <newFileName>
説明:コマンドの最初の部分は一意の行を出力し、2番目の部分、つまり中央の矢印は最初の部分の出力を保存するためのものです。
awk '!seen[$0]++' <filename>
>
<newFileName>
Vi/vimを使用しない別の方法(非常に大きなファイルの場合)は、Linuxコマンドラインからsortおよびuniqを使用する方法です。
sort {file-name} | uniq -u