데이터를 정렬하지 않고 고유한 결과만 얻는 방법은 무엇입니까?

데이터를 정렬하지 않고 고유한 결과만 얻는 방법은 무엇입니까?
$ 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{$_}++'

다음은 awkPerl이 없는 시스템에 대한 번역입니다:

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

nlsort줄 앞에 줄 번호를 인쇄하므로 줄 뒤에 / 가 있으면 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

https://docs.raku.org
https://raku.org

관련 정보