[bash] 명령 줄 도구를 사용하여 정렬 된 순서로 중복 계산

일련의 숫자를 필터링하기 위해 로그 파일을 살펴 보는 명령 (cmd1)이 있습니다. 숫자는 무작위 순서이므로 sort -gr을 사용하여 역으로 정렬 된 숫자 목록을 얻습니다. 이 정렬 된 목록에 중복이있을 수 있습니다. 해당 목록에서 각 고유 번호의 개수를 찾아야합니다.

예를 들어 cmd1의 출력이 다음과 같은 경우 :

100
100
100
99
99
26
25
24
24

위의 출력을 파이프 할 수있는 또 다른 명령이 필요합니다.

100     3
99      2
26      1
25      1
24      2



답변

어때?

$ echo "100 100 100 99 99 26 25 24 24" \
    | tr " " "\n" \
    | sort \
    | uniq -c \
    | sort -k2nr \
    | awk '{printf("%s\t%s\n",$2,$1)}END{print}'

결과는 다음과 같습니다.

100 3
99  2
26  1
25  1
24  2


답변

uniq -c 최소한 GNU uniq 8.23에서 작동하며 원하는대로 정확하게 수행합니다 (정렬 된 입력 가정).


답변

주문이 중요하지 않은 경우

# echo "100 100 100 99 99 26 25 24 24" | awk '{for(i=1;i<=NF;i++)a[$i]++}END{for(o in a) printf "%s %s ",o,a[o]}'
26 1 100 3 99 2 24 2 25 1


답변

숫자를 역순으로 정렬 한 다음 중복 된 숫자를 세고 왼쪽과 오른쪽 단어를 바꿉니다. 열에 맞 춥니 다.

printf '%d\n' 100 99 26 25 100 24 100 24 99 \
   | sort -nr | uniq -c | awk '{printf "%-8s%s\n", $2, $1}'
100     3
99      2
26      1
25      1
24      2


답변

Bash에서는 연관 배열 을 사용하여 각 입력 값의 인스턴스를 계산할 수 있습니다 . 우리는 명령을 가정하면 $cmd1, 예를 들어,

#!/bin/bash

cmd1='printf %d\n 100 99 26 25 100 24 100 24 99'

그런 다음 관련 배열 항목 a에서 ++수학 연산자를 사용하여 배열 변수의 값을 계산할 수 있습니다 .

while read i
do
    ((++a["$i"]))
done < <($cmd1)

결과 값을 인쇄 할 수 있습니다.

for i in "${!a[@]}"
do
    echo "$i ${a[$i]}"
done

출력 순서가 중요하다면 외부 sort키 가 필요할 수 있습니다 .

for i in $(printf '%s\n' "${!a[@]}" | sort -nr)
do
    echo "$i ${a[$i]}"
done


답변