1
votes

Gérer les égalités lors du classement en bash

Disons que j'ai une liste de nombres qui sont déjà triés comme ci-dessous

100   1
222   2
343   3
423   4
423   5
500   6

Ce que je veux, c'est créer un champ de classement de telle sorte que les mêmes valeurs reçoivent le même rang

awk '{print $0, NR}' file

J'ai utilisé le morceau de code suivant pour imiter un champ de classement

100   1
222   2
343   3
423   4
423   4
500   5

Cela me donne ci-dessous, mais c'est techniquement un numéro de ligne .

100
222
343
423
423
500

Comment dois-je procéder? Je suis un débutant absolu en bash , alors j'apprécierais vraiment si vous pouviez ajouter une petite explication pour apprendre.


0 commentaires

3 Réponses :


2
votes

Pourriez-vous essayer ce qui suit.

awk '                 ##Starting awk code from here.
prev==$0              ##Checking condition if variable prev is equal to current line then do following.
{
  --count             ##Subtract count variable with 1 here.
}
{
  print $0,++count    ##Printing current line and variable count with increasing value of it.
  prev=$1             ##Setting value of prev to 1st field of current line.
}
' Input_file          ##Mentioning Input_file name here.

Explication: Ajout d'une explication détaillée pour le code ci-dessus.

awk 'prev==$0{--count} {print $0,++count;prev=$1}' Input_file


0 commentaires

4
votes

C'est un travail pour awk:

$ awk '{           # using awk
if($0!=p)          # if the value does not equal the previous value
    ++r            # increase the rank
print $0,r         # output value and rank
    p=$0           # store value for next round
}' file

Sortie:

100 1
222 2
343 3
423 4
423 4
500 5

Expliqué:

$ awk '{if($0!=p)++r;print $0,r;p=$0}' file


2 commentaires

Si le champ à classer est de 6 $, est-ce ainsi que je l'écrirais? '{if ($ 6! = p) ++ r; print $ 0, r; p = $ 6}'


Oui. Et désolé pour la réponse retardée, mais comme vous l'avez dit une fois, @Gandalf, attendez-vous à moi quand vous me verrez . ;RÉ



1
votes

un autre awk

$ awk '{print $1, a[$1]=a[$1]?a[$1]:++c}' file

100 1
222 2
343 3
423 4
423 4
500 5
423 4

où le fichier n'a pas besoin d'être trié, par exemple après l'ajout d'un nouveau 423 à la fin du fichier

$ awk '{print $1, a[$1]=a[$1]?a[$1]:++c}' file

100 1
222 2
343 3
423 4
423 4
500 5

incrémente le compteur de rang a pour la nouvelle valeur observée, sinon utilisez la valeur enregistrée pour la clé. puisque c est initialisé à zéro, pré-incrémentez la valeur. Cela utilisera la même valeur de classement pour la même clé quelle que soit la position.


1 commentaires

J'aime aussi cette approche. Assez intuitif