web-dev-qa-db-fra.com

Tri des valeurs et recherche du meilleur score (nombre le plus élevé)

J'ai un fichier qui ressemble à ceci:

    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

Ma deuxième colonne contient des identifiants qui ne sont pas triés ici. Certains se répètent, tels que (C00000001) par exemple. Un numéro différent est attribué à chacun d'eux, suivi d'un score: (le numéro commence le plus souvent par -).

Ce que j'aimerais faire, c'est:

1) lire la deuxième colonne (identifiants non triés) et choisir toujours la première qui apparaît. Donc, dans le cas de C00000001, il sélectionnerait le avec score : -37.558.

2) maintenant, lorsque des valeurs uniques sont présentées, j'aimerais les trier en fonction du nombre après le score:, qui correspond au nombre le plus négatif qui doit figurer en première position, tandis que le plus positif se trouve en dernière position.

J'aimerais que la sortie soit imprimée de la même manière que mon fichier d'entrée (même structure).

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

Explication:

  1. sort -k2,2 -u: trie les lignes en fonction de la deuxième colonne et n'en modifie pas l'ordre (car elles ont essentiellement la même valeur) et conserve la première.
  2. sort -k4,4n: triez numériquement sur la base des scores (-r n’a pas besoin de l’inverser).
8
Ravexina

Avec 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

Contribuer avec une commande supplémentaire à une seule ligne qui peut être facilement configurée

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