
일련의 숫자를 필터링하기 위해 로그 파일을 검색하는 명령(cmd1)이 있습니다. 숫자는 무작위 순서이므로 sort -gr
역순으로 정렬된 숫자 목록을 얻는 데 사용합니다. 이 정렬된 목록에는 중복된 항목이 있을 수 있습니다. 해당 목록에 있는 각 고유 번호의 개수를 찾아야 합니다.
예를 들어, cmd1의 출력이 다음과 같은 경우
100 100 100 99 99 26 25 24 24
위의 출력을 파이프할 수 있는 또 다른 명령이 필요하므로 다음을 얻습니다.
100 3 99 2 26 1 25 1 24 2
답변1
출력을 약간 다른 형식으로 처리할 수 있다면 다음을 수행할 수 있습니다.
cmd1 | tr " " "\n" | uniq -c
당신은 돌아올 것입니다 :
3 100
2 99
1 26
1 25
2 24
답변2
-u 스위치도 추가하십시오. 따라서 당신은 다음을 갖게 될 것입니다 :
cmd1 | sort -gru
정렬 맨페이지에서:
-u,-c가 없는 --unique, 동일한 실행 중 첫 번째만 출력합니다.
답변3
(귀하의 입력이 한 줄에 하나의 숫자라고 가정합니다. 그것이 정렬 결과이기 때문입니다.)
awk를 시도해 볼 수 있습니다.
<your_command> | awk '{numbers[$1]++} END {for (number in numbers) print number " " numbers[number]}'
이렇게 하면 정렬되지 않은 목록이 제공되므로(내가 아는 한 배열이 awk에서 탐색되는 순서는 정의되지 않음) 원하는 대로 다시 정렬해야 합니다.
답변4
$ echo '100 100 100 99 99 26 25 24 24' | perl -e 'while (<>) { chomp; my %nums; foreach (split(/ /)) { $nums{$_} += 1; }; foreach (sort {$b <=> $a} keys %nums) { print "$_ $nums{$_} " }; print "\n"; }'
100 3 99 2 26 1 25 1 24 2