배열의 숫자 순서를 반환하는 간단한 함수 이름이 있는지 궁금합니다. 나는 최소한의 방식과 기본 Unix 명령을 사용하여 이 순위를 매기고 싶지만 기본 검색과 루프 외에는 생각할 수 없는 방식으로 그렇게 우아하지 않습니다. 숫자 배열이 있다고 가정 해 봅시다.
17
94
3
52
4
4
9
중복 항목은 동일한 ID에 대해 예상되는 출력만 수신합니다. 중복 항목이 어떻게 처리되는지는 중요하지 않으므로 다음과 같이 바로가기를 사용할 수 있습니다.
4
6
1
5
2
2
3
동기 부여: 오늘날 많은 사용자가 이 문제를 해결하기 위해 다양한 방법을 사용하고 스프레드시트를 사용하여 많은 수동 단계를 수행하는 것을 보았으므로 이 작업을 수행하는 최소한의 방법에 대해 생각하기 시작했습니다.
순위 알고리즘을 Google의 평균 순위와 비교
Google 스프레드시트에서 이렇게 하면 =arrayformula(rank.AVG(A:A,A:A,true))
첫 번째 예상 출력과 같이 오름차순으로 기본을 얻을 수 있습니다.
17 5
94 7
3 1
52 6
4 2.5
4 2.5
9 4
내 초기 순위 알고리즘이 편향되어 있음을 알 수 있습니다. 여기서는 데이터 세트 위치를 설정할 수 있으면 도움이 될 것 같습니다.
답변1
목록이 한 줄에 하나씩 있으면 file
다음을 수행합니다.
sort -nu file |
awk 'NR == FNR {rank[$0] = NR; next}
{print rank[$0]}' - file
다음 위치에 있는 경우 zsh
$array
:
sorted=(${(nou)array})
for i ($array) echo $sorted[(i)$i]
이는 위의 버전과 동일한 원리입니다 awk
.계급숫자로( / ) 정렬된( / ) 고유한( / ) 요소 목록의 색인 / 입니다 NR
.(i)
-n
(n)
sort
(o)
-u
(u)
평균 게재순위의 경우:
sort -n file |
awk 'NR == FNR {rank[$0] += NR; n[$0]++; next}
{print rank[$0] / n[$0]}' - file
이것은 만든다:
5
7
1
6
2.5
2.5
4
( sort -rn
당신처럼 순서를 바꾸는 데 사용됩니다.구글 스프레드시트버전).
답변2
nl x | sort -k 2n | nl | sort -k 2n | cut -f1
...중복된 경우에는 약간 다르게 동작합니다.
nl x | sort -k 2n | nl | sort -k 2n | cut -f1,3
5 17
7 94
1 3
6 52
2 4
3 4
4 9
답변3
그냥 GNU awk를 사용하면 됩니다:
awk '
FNR == NR {numbers[$1]=1; next}
FNR == 1 {
n = asorti(numbers, sorted, "@ind_num_asc")
for (i=1; i<=n; i++) rank[sorted[i]] = i
}
{print rank[$1]}
' file file