$ 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{$_}++'
awk
Perl이없는 시스템을위한 번역은 다음과 같습니다 .
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