IT story

UNIX 쉘 스크립트의 목록에서 고유하거나 다른 값을 선택하십시오.

hot-time 2020. 4. 23. 08:03
반응형

UNIX 쉘 스크립트의 목록에서 고유하거나 다른 값을 선택하십시오.


줄 바꿈으로 구분 된 긴 값 목록을 반환하는 ksh 스크립트가 있으며 고유 / 구별 값 만보 고 싶습니다. 이것을 할 수 있습니까?

예를 들어 내 출력이 디렉토리의 파일 접미사라고 가정 해보십시오.

tar
gz
java
gz
java
tar
class
class

다음과 같은 목록을보고 싶습니다.

tar
gz
java
class

uniqsort응용 프로그램 을보고 싶을 수 있습니다 .

./yourscript.ksh | 정렬 | 유니크

(FYI, 예,이 명령 줄에서 정렬이 필요하며 uniq서로 바로 뒤에있는 중복 줄만 제거합니다)

편집하다:

의 명령 줄 옵션 과 관련하여 Aaron Digulla 가 게시 한 내용과 반대로 uniq:

다음과 같은 입력이 주어집니다.

수업
항아리
항아리
항아리
큰 상자
큰 상자
자바

uniq 모든 줄을 정확히 한 번 출력합니다.

수업
항아리
큰 상자
자바

uniq -d 두 번 이상 나타나는 모든 줄을 출력하고 한 번 인쇄합니다.

항아리
큰 상자

uniq -u 정확히 한 번 나타나는 모든 행을 출력하고 한 번 인쇄합니다.

수업
자바

./script.sh | sort -u

이것은 일산화탄소의 대답 과 동일 하지만 조금 더 간결합니다.


정렬이 바람직하지 않은 큰 데이터 세트의 경우 다음 perl 스크립트를 사용할 수도 있습니다.

./yourscript.ksh | perl -ne 'if (!defined $x{$_}) { print $_; $x{$_} = 1; }'

이것은 기본적으로 모든 라인 출력을 기억하여 다시 출력하지 않습니다.

sort | uniq정렬이 필요하지 않다는 점에서 " "솔루션 보다 장점이 있습니다 .


zsh사용하면 다음을 수행 할 수 있습니다.

zsh-5.0.0[t]% 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를 사용할 수 있습니다.

zsh-4.3.9[t]% awk '!_[$0]++' infile    
tar
more than one word
gz
java
class

파이프를 통해 sort하고 uniq. 이렇게하면 모든 중복이 제거됩니다.

uniq -d복제본 uniq -u만 제공하고 고유 한 복제본 만 제공합니다 (중복 복제본).


AWK를 사용하면 할 수있는 것보다 더 빠릅니다.

 ./yourscript.ksh | awk '!a[$0]++'

요청에 따라 고유하지만 정렬되지는 않습니다.
~ 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[@]}"

참고 URL : https://stackoverflow.com/questions/618378/select-unique-or-distinct-values-from-a-list-in-unix-shell-script

반응형