긴 항목 목록 (각 줄에 하나씩)이 포함 된 텍스트 파일이 있습니다. 이들 중 일부는 중복되며 중복을 제거하는 것이 가능한지 (그리고 그렇다면 어떻게) 알고 싶습니다. 가능한 경우 vi / vim 내에서이 작업을 수행하는 데 관심이 있습니다.
긴 항목 목록 (각 줄에 하나씩)이 포함 된 텍스트 파일이 있습니다. 이들 중 일부는 중복되며 중복을 제거하는 것이 가능한지 (그리고 그렇다면 어떻게) 알고 싶습니다. 가능한 경우 vi / vim 내에서이 작업을 수행하는 데 관심이 있습니다.
답변:
파일 정렬에 문제가 없으면 다음을 사용할 수 있습니다.
:sort u
:%!uniq
파일을 정렬하지 않고 단순히 중복 항목을 제거 하는 데 사용 하십시오.
u
이 시도:
:%s/^\(.*\)\(\n\1\)\+$/\1/
바로 뒤에 하나 이상의 복사본이 오는 줄을 검색하고 단일 복사본으로 바꿉니다.
시도하기 전에 파일의 사본을 만드십시오. 테스트되지 않았습니다.
명령 줄에서 다음을 수행하십시오.
sort file | uniq > file.new
:sort u
내 큰 파일에 매달려있는 것처럼 수락 된 답변을 얻을 수 없습니다 . 이것은 매우 빠르고 완벽하게 작동했습니다. 감사합니다!
'uniq' is not recognized as an internal or external command, operable program or batch file.
g/^\(.*\)$\n\1/d
Windows에서 나를 위해 작동합니다. 하지만 줄을 먼저 정렬해야합니다.
aaaa
뒤에 오는 줄은 잘못 aaaabb
삭제 aaaa
됩니다.
위의 두 가지 답변을 결합합니다.
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>