답변:
uniq
및 sort
응용 프로그램 을보고 싶을 수 있습니다 .
./yourscript.ksh | 정렬 | 유니크
(FYI, 예,이 명령 줄에서 정렬이 필요하며 uniq
서로 바로 뒤에있는 중복 줄만 제거합니다)
편집하다:
Aaron Digullauniq
의 명령 줄 옵션 과 관련하여 게시 된 내용과 달리 :
다음과 같은 입력이 주어집니다.
수업 항아리 항아리 항아리 큰 상자 큰 상자 자바
uniq
모든 줄을 정확히 한 번 출력합니다.
수업 항아리 큰 상자 자바
uniq -d
두 번 이상 나타나는 모든 줄을 출력하고 한 번 인쇄합니다.
항아리 큰 상자
uniq -u
정확히 한 번 나타나는 모든 줄을 출력하고 한 번 인쇄합니다.
수업 자바
sort
하는 -u
버전도 제공합니다.
uniq
이음새가 sort
먹이기 전에 입력 할 수 있음을 의미하는 인접한 라인 만 (적어도 기본적으로) 처리 한다는 것을 알았습니다 uniq
.
정렬이 바람직하지 않은 큰 데이터 세트의 경우 다음 perl 스크립트를 사용할 수도 있습니다.
./yourscript.ksh | perl -ne 'if (!defined $x{$_}) { print $_; $x{$_} = 1; }'
기본적으로 모든 라인 출력을 기억하여 다시 출력하지 않습니다.
sort | uniq
정렬이 필요하지 않다는 점에서 " "솔루션 보다 장점이 있습니다 .
zsh 를 사용하면 다음을 수행 할 수 있습니다.
% cat infile
tar
more than one word
gz
java
gz
java
tar
class
class
zsh-5.0.0[t]% print -l "${(fu)$(<infile)}"
tar
more than one word
gz
java
class
또는 AWK를 사용할 수 있습니다.
% awk '!_[$0]++' infile
tar
more than one word
gz
java
class
awk
솔루션 ( 설명 은 stackoverflow.com/a/21200722/45375 참조 )은 고유 한 행 수가 충분히 적은 한 (고유 한 행이 메모리에 유지되는 한) 큰 파일에서 작동합니다. ). 이 zsh
솔루션은 전체 파일을 메모리로 먼저 읽습니다. 큰 파일의 경우 옵션이 아닐 수 있습니다. 또한 작성된대로 공백이 포함되지 않은 행만 올바르게 처리됩니다. 이 문제를 해결하려면 IFS=$'\n' read -d '' -r -A u <file; print -l ${(u)u}
대신 사용하십시오.
(IFS=$'\n' u=($(<infile)); print -l "${(u)u[@]}")
[@]
배열의 모든 요소를 참조하기 위해 접미사가 필요할 때 궁금합니다. 적어도 버전 5부터는 그것없이 작동합니다. 또는 명확성을 위해 추가 했습니까?
print -l "${(fu)$(<infile)}"
awk
. 샘플 출력도 자유롭게 수정했습니다 .
파이프를 통해 sort
하고 uniq
. 이렇게하면 모든 중복이 제거됩니다.
uniq -d
복제본 uniq -u
만 제공하고 고유 한 복제본 만 제공합니다 (스트립 복제본).
uniq -u
기본 동작이 아닙니다 (자세한 내용은 내 답변의 편집 참조)
요청에 따라 고유하지만 정렬되지는 않습니다.
~ 70 개 미만의 요소에 대해 적은 시간의 시스템 리소스를 사용합니다 (시간에 따라 테스트 됨).
stdin에서 입력을 받도록 작성
(또는 다른 스크립트에 수정 및 포함) :
(Bash)
bag2set () {
# Reduce a_bag to a_set.
local -i i j n=${#a_bag[@]}
for ((i=0; i < n; i++)); do
if [[ -n ${a_bag[i]} ]]; then
a_set[i]=${a_bag[i]}
a_bag[i]=$'\0'
for ((j=i+1; j < n; j++)); do
[[ ${a_set[i]} == ${a_bag[j]} ]] && a_bag[j]=$'\0'
done
fi
done
}
declare -a a_bag=() a_set=()
stdin="$(</dev/stdin)"
declare -i i=0
for e in $stdin; do
a_bag[i]=$e
i=$i+1
done
bag2set
echo "${a_set[@]}"