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.
3 Réponses :
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
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
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É
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.
J'aime aussi cette approche. Assez intuitif