Ich denke, ob es einen Namen für eine so einfache Funktion gibt, die die Reihenfolge der Zahlen in einem Array zurückgibt. Ich würde dieses Ranking wirklich gerne auf minimalistische Weise und mit grundlegenden Unix-Befehlen durchführen, aber ich kann mir nichts anderes vorstellen als einfaches Find-and-Loop, das nicht so elegant ist. Angenommen, Sie haben eine Reihe von Zahlen
17
94
3
52
4
4
9
Erwartete Ausgabe, bei der Duplikate nur dieselbe ID erhalten; Der Umgang mit Duplikaten ist nicht kritisch. Nehmen Sie also Verknüpfungen:
4
6
1
5
2
2
3
Motivation: Ich habe heute viele Benutzer gesehen, die viele verschiedene Methoden zur Lösung dieses Problems verwendet und viele manuelle Schritte mit Spreadsheet ausgeführt haben. Also fing ich an, über den minimalistischen Weg nachzudenken.
Vergleich des Ranking-Algorithmus mit dem durchschnittlichen Ranking von Google
Wenn Sie dies in Google Spreadsheet tun, erhalten =arrayformula(rank.AVG(A:A,A:A,true))
Sie als Benchmark eine aufsteigende Reihenfolge wie die erste erwartete Ausgabe
17 5
94 7
3 1
52 6
4 2.5
4 2.5
9 4
wo Sie sehen, dass mein anfänglicher Ranking-Algorithmus voreingenommen ist. Ich denke, dass es hier hilfreich wäre, den Speicherort des Datensatzes festlegen zu können.
quelle
Antworten:
Wenn diese Liste in einer Liste
file
pro Zeile enthalten wäre, würde ich Folgendes tun:Wenn es in einem
zsh
$array
:Dies ist das gleiche Prinzip wie bei der
awk
obigen Version. Der Rang ist der IndexNR
/(i)
in der numerisch (-n
/(n)
) geordneten (sort
/(o)
), eindeutigen (-u
/(u)
) Liste der Elemente.Für Ihren durchschnittlichen Rang:
Welches gibt:
(Verwenden Sie
sort -rn
diese Option, um die Reihenfolge wie in Ihrer Google Spreadsheet- Version umzukehren .)quelle
... es hat ein etwas anderes Verhalten bei Duplikaten:
quelle
nl x | sort -k 2rn | nl | sort -k 2n | cut -f1,3
Mit nur GNU awk:
quelle
numbers[$1]=1
dies vereinfacht werden kann,numbers[$1]
da Sie sich nicht um die Werte dieses Hashs kümmern.h[key]
ist es idiomatisch, den Schlüssel eines Hash zuzuweisen, währenda[key]=1
es idiomatisch wäre , dem Hash-Element von durch diesen Schlüssel einen wahren Wert zu geben .