program story

vi에서 중복 행을 제거 하시겠습니까?

inputbox 2020. 7. 26. 13:01
반응형

vi에서 중복 행을 제거 하시겠습니까?


긴 항목 목록을 포함하는 텍스트 파일이 있습니다 (각 줄에 하나씩). 이 중 일부는 중복이므로 중복을 제거 할 수 있는지 (있는 경우) 어떻게해야하는지 알고 싶습니다. 가능한 경우 vi / vim 내 에서이 작업을 수행하고 싶습니다.


파일을 정렬해도 괜찮다면 다음을 사용할 수 있습니다.

:sort u

이 시도:

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

하나 이상의 사본 자체가 뒤 따르는 행을 즉시 검색하여 단일 사본으로 바꿉니다.

시도하기 전에 파일 사본을 만드십시오. 테스트되지 않았습니다.


커맨드 라인에서 다음을 수행하십시오.

sort file | uniq > file.new

awk '!x[$0]++' yourfile.txt순서를 유지하려는 경우 (즉, 정렬이 허용되지 않음). vim에서 호출하기 위해 :!사용할 수 있습니다.


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

Windows에서 작동합니다. 그래도 줄을 먼저 정렬해야합니다.


위의 두 가지 답변을 결합합니다.

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

1G
!Gsort
1G
!Guniq

얼마나 많은 중복 라인이 제거되었는지 확인하려면 버퍼에 존재하는 라인 수를 확인하기 전후에 control-G를 사용하십시오.


비주얼 라인 모드 ( Shift+ v) 에서 라인을 선택한 다음을 선택하십시오 :!uniq. 그것은 차례로 오는 복제본 만 잡을 것입니다.


VimL에서 Uniq를 구현하는 방법에 대해서는 내가 관리 하는 플러그인 에서 Uniq를 검색하십시오 . Vim 메일 링리스트에 제공된 다양한 방법을 볼 수 있습니다.

그렇지 않으면 :sort u실제로 갈 길입니다.


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

또는

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

이것은 당신을위한 나의 대답입니다, 그것은 여러 개의 중복 줄을 제거하고 하나만 제거하지 않을 수 있습니다!


을 사용 !}uniq하지만 빈 줄이없는 경우에만 작동합니다.

파일의 모든 줄에 대해 다음을 사용하십시오 :1,$!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

이것은 나를 위해 일 .csv했고.txt

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

설명 : 명령의 첫 번째 부분은 고유 한 행을 인쇄하고 두 번째 부분은 중간 화살표 다음에 첫 번째 부분의 출력을 저장하는 것입니다.

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

>

<newFileName>

참고 URL : https://stackoverflow.com/questions/351161/removing-duplicate-rows-in-vi

반응형