파일에서 중복된 줄을 제거하되 1개의 항목은 유지합니다.

파일에서 중복된 줄을 제거하되 1개의 항목은 유지합니다.

파일에서 중복된 줄을 제거하고 싶지만 파일에 1개의 항목을 유지하고 싶습니다.

파일 예:

this is a string
test line
test line 2
this is a string

위의 예에서 "이것은 문자열입니다"라는 항목 1개를 제거하고 싶습니다.

이를 수행하는 가장 좋은 방법은 무엇입니까?

답변1

데모 파일에는 다음 stuff.txt이 포함됩니다.

one
two
three
one
two
four
five

행 정렬이 마음에 들지 않는다고 가정하고 파일에서 중복 행을 제거하십시오.

$ sort -u stuff.txt 
five
four
one
three
two

설명: 정렬을 위해 전송된 u 플래그는 파일의 행을 정렬하고 고유성을 강제하는 것을 의미합니다.

첫 번째 줄을 유지하면서 원래 순서를 유지하면서 파일에서 중복 줄을 제거합니다.

$ cat -n stuff.txt | sort -uk2 | sort -nk1 | cut -f2-
one
two
three
four
five

설명: cat에 전달된 n 플래그는 각 줄의 왼쪽에 줄 번호와 공백을 추가합니다. 첫 번째 정렬은 고유한 정렬을 의미하지만 첫 번째 단어 뒤에만 해당하고 두 번째 정렬 명령은 우리를 사용하는 것을 의미합니다. 1단계에서 저장한 내용은 원래 순서대로 저장되어야 했고, 결국 첫 번째 단어가 잘렸습니다.

파일에서 중복된 줄을 제거하여 순서를 유지하고 마지막 줄을 유지합니다.

tac stuff.txt > stuff2.txt; cat -n stuff2.txt | sort -uk2 | sort -nk1 | cut -f2- > stuff3.txt; tac stuff3.txt > stuff4.txt; cat stuff4.txt
three
one
two
four
five

설명: 이전과 동일하지만 tac이 파일을 반전하여 원하는 결과를 얻습니다.

답변2

마지막 항목만 남기고 모두 삭제하는 것은 첫 번째 항목만 남기고 모두 삭제하는 것과 반대이므로 다음과 같은 해결 방법도 있습니다.

tac file | awk '! seen[$0]++' | tac

tac파일의 줄을 반대로 바꾸고 awk중복된 줄이 처음 나타나는 부분만 출력합니다.

답변3

귀하의 의견에 따라 다른 출력을 생성하거나 새 파일에 추가하지 않고도 결과가 동일한 출력 파일이 되도록 하려면 다음을 사용할 수 있습니다.

예:

gawk -i inplace '!a[$0]++' $file

답변4

vim을 사용하는 경우 다음 코드를 시도해 볼 수 있습니다.

g/./if(temp == getline('.')) | let temp = getline('.') | else | :norm dd | endif

관련 정보