데이터를 정렬하지 않고 고유 한 결과 만 얻는 방법은 무엇입니까? 표시하여 파일의 원래

$ 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작업을 일반적으로 어떻게 수행 할 수 있습니까?



답변

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]++'

답변

john 에는 다음과 같은 도구가 있습니다 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나중에 줄 번호를 삭제합니다.;)


답변

나는 이것을 사용하는 것을 선호한다 :

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로 유지 (즉, 포함 된 줄 번호는 생략)


답변

Perl에는이라는 함수가 포함 된 모듈을 사용할 수 있습니다 uniq. 따라서 Perl의 배열에로드 된 데이터를 ave하면이 기능을 호출하여 고유하게 만들지 만 여전히 원래 순서를 유지하십시오.

use List::MoreUtils qw(uniq)
@output = uniq(@output);

이 모듈에 대한 자세한 내용은 여기를 참조하십시오 : List :: MoreUtils