it-swarm.com.de

Werte sortieren und die beste Punktzahl ermitteln (höchste Zahl)

Ich habe eine Datei, die so aussieht:

    7  C00000002 score:  -41.156 nathvy =  49 nconfs =         2251
    8  C00000002 score:  -39.520 nathvy =  49 nconfs =         3129
    9  C00000004 score:  -38.928 nathvy =  24 nconfs =          150
   10  C00000002 score:  -38.454 nathvy =  49 nconfs =         9473
   11  C00000004 score:  -37.704 nathvy =  24 nconfs =          156
   12  C00000001 score:  -37.558 nathvy =  41 nconfs =           51
    2  C00000002 score:  -48.649 nathvy =  49 nconfs =         3878
    3  C00000001 score:  -44.988 nathvy =  41 nconfs =         1988
    4  C00000002 score:  -42.674 nathvy =  49 nconfs =         6740
    5  C00000002 score:  -42.453 nathvy =  49 nconfs =         4553
    6  C00000002 score:  -41.829 nathvy =  49 nconfs =         7559

Meine zweite Spalte enthält einige IDs, die hier nicht sortiert sind. Einige davon wiederholen sich, z. B. (C00000001). Allen wird eine andere Nummer zugewiesen, gefolgt von einer Punktzahl: (Die Nummer beginnt am häufigsten mit -).

Was ich gerne machen würde ist:

1) Lesen Sie die zweite Spalte (nicht sortierte IDs) und wählen Sie immer die erste aus, die angezeigt wird. Im Falle von C00000001 würde es also mit score : -37.558 auf "on" klicken.

2) Wenn jetzt eindeutige Werte angezeigt werden, möchte ich sie nach der Zahl nach score: sortieren. Dies bedeutet, dass die negativste Zahl auf der ersten Position und die positivste Zahl auf der letzten Position steht.

Ich möchte die Ausgabe genauso wie meine Eingabedatei ausdrucken lassen (gleiche Struktur).

4
djordje
$ sort -k2,2 -u < filename | sort -k4,4n

7  C00000002 score:  -41.156 nathvy =  49 nconfs =         2251
9  C00000004 score:  -38.928 nathvy =  24 nconfs =          150
12 C00000001 score:  -37.558 nathvy =  41 nconfs =           51

Erläuterung:

  1. sort -k2,2 -u: Sortiert die Zeilen basierend auf der zweiten Spalte und ändert die Reihenfolge nicht (weil sie im Grunde den gleichen Wert haben) und behält den ersten bei.
  2. sort -k4,4n: Numerische Sortierung basierend auf den Punktzahlen (es ist nicht erforderlich, dass -r diese umkehrt).
8
Ravexina

Mit GNU awk> 4.0:

$ gawk '
    !seen[$2] {seen[$2] = $0} 
    END {PROCINFO["sorted_in"] = "@val_num_asc"; for (i in seen) print seen[i]}
  ' file
    7  C00000002 score:  -41.156 nathvy =  49 nconfs =         2251
    9  C00000004 score:  -38.928 nathvy =  24 nconfs =          150
   12  C00000001 score:  -37.558 nathvy =  41 nconfs =           51
1
steeldriver

Beitrag mit einem zusätzlichen einzeiligen Befehl, der einfach konfiguriert werden kann

for row in $(cat tmp |  awk '{print $2}' | sort | uniq); do cat tmp | grep $row | head -n 1; done | sort -r --key=4

7  C00000002 score:  -41.156 nathvy =  49 nconfs =         2251
9  C00000004 score:  -38.928 nathvy =  24 nconfs =          150
12  C00000001 score:  -37.558 nathvy =  41 nconfs =           51
0
toerq