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
A voir également:
- Decompte de parttern avec awk
- Décompte de Jours ✓ - Forum Logiciels
- Musique décompte - Forum Musique / Radio / Clip
- Shell - Utilisation de variable avec awk ✓ - Forum Shell
- [Awk] appel variable système dans script awk - Forum Shell
- Décompte sur iMovie - Forum MacOS
1 réponse
Bonjour,
Tu peux utiliser ce script, qui repose sur un tableau associatif (aka dictionnaire ou map selon les langages) :
toto.awk
Explication
toto.txt
Exécution
Exemple :
Si tu veux récupérer le contenu dans un fichier, on gère ça à l'appel du script :
Remarque
Note que les clés sont triés par ordre alphabétiques par
Bonne chance
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 par
awk. 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
C est super Merci Beaucoup pour ton coup de main.
Bonne et heureuse année 2021 à tous
Merci encore