it-source

UNIX 쉘 스크립트의 목록에서 고유 값 또는 고유 값 선택

criticalcode 2023. 4. 16. 15:14
반응형

UNIX 쉘 스크립트의 목록에서 고유 값 또는 고유 값 선택

ksh 스크립트는 긴 값 목록을 반환하고 줄 바꿈을 구분하여 고유한 값/구체적인 값만 표시합니다.이거 할 수 있어?

예를 들어, 내 출력이 디렉토리 내의 파일서픽스라고 합니다.

tar
gz
java
gz
java
tar
class
class

다음과 같은 목록을 봅니다.

tar
gz
java
class

여기 보시면uniq그리고.sort적용들.

./yourscript.ksh | sort | uniq

(참고로, 이 명령어라인에서는 이러한 분류가 필요합니다.uniq서로 바로 뒤에 있는 중복된 라인만 제거합니다.)

편집:

에런 디굴라가 올린 글과는 달리uniq의 명령줄 옵션:

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

학급항아리항아리항아리휴지통휴지통자바

uniq는 모든 행을 1회 정확하게 출력합니다.

학급항아리휴지통자바

uniq -d는 여러 번 표시되는 모든 행을 출력하여 1회 인쇄합니다.

항아리휴지통

uniq -u는, 1 회 정확하게 표시되는 모든 행을 출력해, 1 회 인쇄합니다.

학급자바
./script.sh | sort -u

일산화탄소의 답변같지만 좀 더 간결하다.

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를 사용하면 다음 작업을 수행할 수 있습니다.

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

정렬이나 유니크보다 더 빨리 찾을 수 있습니다.

파이프로 통과시키다sort그리고.uniq이렇게 하면 중복된 항목이 모두 제거됩니다.

uniq -d중복된 내용만 제공합니다.uniq -u는, 일의의 것(복제된 것)만을 나타냅니다.

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

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

기본적으로는 모든 라인 출력이 기억되기 때문에 다시 출력되지 않습니다.

"보다 유리합니다.sort | uniq미리 분류할 필요가 없다는 점에서 해결책입니다.

요청에 따라 고유(단, 정렬되지 않음)
(시간 경과에 따라 테스트한 결과) 최대 70개 미만의 요소에 대해 시스템 리소스를 적게 사용합니다.
stdin에서 입력을 받도록 작성되었습니다.
(또는 수정하여 다른 스크립트에 포함):
(바쉬)

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[@]}"

파일의 중복되지 않는 엔트리를 취득하기 위한 힌트를 얻을 수 있습니다.

awk '$0 != x ":FOO" && NR>1 {print x} {x=$0} END {print}' file_name | uniq -f1 -u

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

반응형