$ cat data.txt
aaaaaa
aaaaaa
cccccc
aaaaaa
aaaaaa
bbbbbb
$ cat data.txt | uniq
aaaaaa
cccccc
aaaaaa
bbbbbb
$ cat data.txt | sort | uniq
aaaaaa
bbbbbb
cccccc
$
내가 필요한 결과는원본 파일의 모든 줄을 표시하고 파일의 원래 명령문 순서를 유지하면서 모든 중복 항목(연속 줄뿐만 아니라)을 제거합니다..
이 예에서 제가 실제로 찾고 있는 결과는 다음과 같습니다.
aaaaaa
cccccc
bbbbbb
일반적으로 이 일반 작업을 어떻게 수행합니까 uniq
?
답변1
perl -ne 'print unless $seen{$_}++' data.txt
또는 꼭 가지고 있어야 하는 경우쓸모없는 사용cat
:
cat data.txt | perl -ne 'print unless $seen{$_}++'
다음은 awk
Perl이 없는 시스템에 대한 번역입니다:
awk '!seen[$0]++' data.txt
cat data.txt | awk '!seen[$0]++'
답변2
남자다음과 같은 도구가 있습니다 unique
.
usr@srv % cat data.txt | unique out
usr@srv % cat out
aaaaaa
cccccc
bbbbbb
다른 도구를 사용하지 않고 단일 명령줄에서 동일한 목표를 달성하는 것은 좀 더 복잡합니다.
usr@srv % cat data.txt | nl | sort -k 2 | uniq -f 1 | sort -n | sed 's/\s*[0-9]\+\s\+//'
aaaaaa
cccccc
bbbbbb
nl
sort
줄 앞에 줄 번호를 인쇄하므로 줄 뒤에 / 가 있으면 uniq
줄의 원래 순서를 복원할 수 있습니다. sed
그 뒤에 있는 줄 번호를 제거하세요. ;)
답변3
나는 이것을 사용하는 것을 선호합니다 :
cat -n data.txt | sort --key=2.1 -b -u | sort -n | cut -c8-
cat -n
줄 번호를 추가하고,
sort --key=2.1 -b -u
두 번째 필드(추가된 행 번호 뒤)를 기준으로 정렬하고 선행 공백을 무시하고 고유한 행을 유지합니다.
sort -n
엄격한 숫자 순서로 정렬
cut -c8-
8열부터 EOL까지의 모든 문자를 유지합니다(즉, 포함된 줄 번호 생략).
답변4
사용행복하다(이전 Perl_6)
~$ raku -e '.put for lines.unique;' file
이상awk
-유사한 구문):
~$ raku -ne 'state %h; .put unless %h{$_}++ ;' file
입력 예:
aaaaaa
aaaaaa
cccccc
aaaaaa
aaaaaa
bbbbbb
예제 출력:
aaaaaa
cccccc
bbbbbb