일련의 숫자를 필터링하기 위해 로그 파일을 살펴 보는 명령 (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