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

リストが1行に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あなたのように順序を変更するために使用されます。Googleスプレッドシートバージョン)。

答え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

関連情報