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


82

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

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

100 
100 
100 
99 
99 
26 
25 
24 
24

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

100     3
99      2
26      1
25      1
24      2


답변:


94

어때?

$ 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

1
나는 이것을 실행했고 마지막에 $ 1, $ 2의 추가 인쇄 명세서를 생성했습니다 :100 3 99 2 26 1 25 1 24 2 2 24
Mittenchops 2013 년

3
다음은 결과 사이에 새 줄을 추가하고 끝에 추가 줄을 제거합니다. 따라서 다음과 같은 결과 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}' | head -n -1를 얻을 수 있습니다.100 3 99 2 26 1 25 1 24 2
Woody

구문에 대한 참고 사항은 백 슬래시를 사용하는 대신 파이프로 줄을 끝낼 수 있습니다.
wjandrea

53

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


2
입력이 정렬되지 않은 경우 경우에, 그럼 그냥 추가 sort: 명령sort file_name | uniq -c
미하일 게 이어

대박. Mac OS X에서도 작동합니다! Mojave 10.14.6에서 테스트되었습니다.
bappak

10

주문이 중요하지 않은 경우

# 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

파이프를 3 개 줄이면 +1. 이것이 어떻게 작동하는지 자세히 설명해 주시면 굉장 할 것입니다. ;-) 감사.
SaxDaddy 2014-10-27

9

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

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

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.