Unix에서 배열의 숫자를 정렬하는 방법은 무엇입니까?

Unix에서 배열의 숫자를 정렬하는 방법은 무엇입니까?

배열의 숫자 순서를 반환하는 간단한 함수 이름이 있는지 궁금합니다. 나는 최소한의 방식과 기본 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

관련 정보