Decompte de parttern avec awk
Résolu
Bonjour à tous,
Je souhaiterais faire le décompte de plusieurs parttern d'une même ligne avec awk
Fichier de départ :
Fichier de sortie :
Je souhaiterais faire le décompte de plusieurs parttern d'une même ligne avec awk
Fichier de départ :
309 MRBTS-10309 FRGU FXDB FXDB FBBA FBBA FSMF
309 MRBTS-20309 FRMF FXED FBBC FSMF
3090 MRBTS-13090 FHDB FHDB FHDB FBBC FSMF
Fichier de sortie :
309;MRBTS-10309;1FRGU;2FXDB;2FBBA;1FSMF
309;MRBTS-20309;1FRMF;1FXED;1FBBC;1FSMF
3090;MRBTS-13090;3FHDB;1FBBC;1FSMF
1 réponse
-
Bonjour,
Tu peux utiliser ce script, qui repose sur un tableau associatif (aka dictionnaire ou map selon les langages) :
toto.awk
{ if (NF >= 3) { for (i = 3; i <= NF; i++) { dict[$i] += 1; } s = $1 ";" $2; for (key in dict) { n = dict[key]; s = s ";" n key } print s; delete dict; } }
Explication-
NF
compte le nombre de champs (fields) dans la ligne courante ($0
). Chaque field correspond aux valeurs prises par$1
,$2
, etc. - Dans la première boucle
for
, on stocke dansdict
pour chaque clé le nombre d'occurrences observées. Si une clé n'existe pas encore, comme en C++, la valeur correspondant est associée à une valeur par défaut (0
dans le cas d'un entier). - Ensuite on commence à préparer la chaîne
s
qui va contenir la chaîne transformée, en concaténant$1
, la chaîne de caractère ";" et$2
. - On itère sur chaque clé du dictionnaire
key
et on récupère le compteur associédict[key]
. - Enfin on affiche
s
sur la sortie standard
toto.txt
309;MRBTS-10309;1FRGU;2FXDB;1FSMF;2FBBA
309;MRBTS-20309;1FBBC;1FRMF;1FSMF;1FXED
3090;MRBTS-13090;1FBBC;3FHDB;1FSMF
Exécution
awk -f toto.awk toto.txt
Exemple :
(mando@silk) (~) $ awk -f toto.awk toto.txt
309;MRBTS-10309;1FRGU;2FXDB;1FSMF;2FBBA
309;MRBTS-20309;1FBBC;1FRMF;1FSMF;1FXED
3090;MRBTS-13090;1FBBC;3FHDB;1FSMF
Si tu veux récupérer le contenu dans un fichier, on gère ça à l'appel du script :
awk -f toto.awk toto.txt > toto2.txt
Remarque
Note que les clés sont triés par ordre alphabétiques parawk
. Le résultat n'est donc pas exactement celui posé dans la question, mais je suppose que ça n'est pas très important...
Bonne chance -