Compter occurrence et addition de données

symbol

Membre actif
13 Octobre 2004
536
25
Re,

Maintenant que j'ai pas mal de données (dans un fichier texte), j'aimerais les exploiter.


Pour compter les occurences dans un texte, la syntaxe semble :
Bloc de code:
cat monFichier | grep monMot | wc -l

Par contre, comment compter les occurrences de mots différents qui se situent entre ":" et ":"

Par exemple :
dans le texte ci dessous, on voit qu'il a plusieurs mots différents entre ":" et ":"

JEUDI 05 JUILLET 2018 - MIDI : MAGNETICO : X1 (06,07,09,69) [4/6]▶ 2 € X1 -------- ★★ 2 € ★★
MERCREDI 04 JUILLET 2018 - SOIR : ELSIE : X1 (31,37,16) [3/4]▶ 5 € X1 -------- ★★ 5 € ★★
MERCREDI 04 JUILLET 2018 - SOIR : ELSIE : X1 (31,37,15) [3/4]▶ 5 € X1 -------- ★★ 5 € ★★
MERCREDI 04 JUILLET 2018 - SOIR : ELSIE : X1 (31,37,14) [3/4]▶ 5 € X1 -------- ★★ 5 € ★★
MERCREDI 04 JUILLET 2018 - SOIR : ELSIE : X1 (31,37,10) [3/4]▶ 5 € X1 -------- ★★ 5 € ★★

Pour le coup, la commande (cat monFichier | grep monMot | wc -l) est inefficace car elle sait compter 1 mot clairement identifié.

J'imagine qu'il faut aménager cette commande pour compter chaque occurence différente qui se situe entre ":" et ":", en sachant qu'il peut y avoir un nombre inconnu de mots différents.

Il faut vraiment maitriser parfaitement les subtilités des commandes pour arriver a un résultat.

J'aimerais savoir le faire, mais.... :-/

Si quelqu'un souhaite me guider. Merci.
 
Tu peux faire :
Bloc de code:
cat monFichier | grep :*: | wc -l

  • l'astérisque * > équivalant à : "toute occurrence" > inséré ici entre les : : pour donner :*: (':*:' si tu veux compliquer)
 
effectivement ca fonctionne mais, ca ne donne pas le nombre d'occurence par mot différent.

Ca me donne 5, en realité ca devrait donner 1 (MAGNETICO) et 4 (ELSIE)
 
La finalité de ce que je souhaite, c'est afficher les "pseudos" (qui se trouve entre les ":" et ":") ainsi que le total des gains (sur les 100 derniers tirages) associer a chaque pseudo, qui se trouve dans un fichier RESULTATSHISTORIQUE.txt

Par exemple, il faudrait que ca donne :
pseudo1 (250 €)
pseudo2 (10€)
pseudo3 (100€)
etc...

Avant d'arriver a quoique ce soit, il faut deja definir, comment realiser la chose.
Faut-il conserver que les pseudos (en retirant les infos superflus) + les gains, ensuite additionner ?
Faut-il conserver que les pseudos (en retirant les infos superflus) + les gains, ensuite trier par ordre alphabetique les pseudos, puis additionner les gains liés a ses pseudos ?

Il faut definir la méthode, puis connaitre les bonnes commandes :-/

A moins que ce ne soit pas possible a faire


Voici quand meme le texte des resultats (la taille max sera de 100 lignes)

JEUDI 05 JUILLET 2018 - SOIR : MICROSEB : X1 (06,21,37,56) [4/7]▶ 2 € X1 -------- ★★ 2 € ★★
JEUDI 05 JUILLET 2018 - SOIR : MICROSEB : X1 (06,21,65,66) [4/7]▶ 2 € X1 -------- ★★ 2 € ★★
JEUDI 05 JUILLET 2018 - SOIR : MICROSEB : X1 (06,21) [2/3]▶ 2 € X1 -------- ★★ 2 € ★★
JEUDI 05 JUILLET 2018 - SOIR : MICROSEB : X1 (06,37) [2/3]▶ 2 € X1 -------- ★★ 2 € ★★
JEUDI 05 JUILLET 2018 - SOIR : MICROSEB : X1 (21,59) [2/3]▶ 2 € X1 -------- ★★ 2 € ★★
JEUDI 05 JUILLET 2018 - SOIR : MICROSEB : X1 (06,21) [2/3]▶ 2 € X1 -------- ★★ 2 € ★★
JEUDI 05 JUILLET 2018 - MIDI : MAGNETICO : X1 (06,07,09,69) [4/6]▶ 2 € X1 -------- ★★ 2 € ★★
MERCREDI 04 JUILLET 2018 - SOIR : ELSIE : X1 (31,37,16) [3/4]▶ 5 € X1 -------- ★★ 5 € ★★
MERCREDI 04 JUILLET 2018 - SOIR : ELSIE : X1 (31,37,15) [3/4]▶ 5 € X1 -------- ★★ 5 € ★★
MERCREDI 04 JUILLET 2018 - SOIR : ELSIE : X1 (31,37,14) [3/4]▶ 5 € X1 -------- ★★ 5 € ★★
MERCREDI 04 JUILLET 2018 - SOIR : ELSIE : X1 (31,37,10) [3/4]▶ 5 € X1 -------- ★★ 5 € ★★
 
Dernière édition:
Bloc de code:
cat monFichier | grep :*: | sort -u | wc -l

par contre, ça te trie les pseudos en même temps !
 
J'ai une petite conclusion à l'ensemble des messages que tu as produit @symbol
Il aurait été vachement judicieux, dès le début, de définir tes besoins, plutôt que d'empiler petit à petit les fonctionnalités.
Si toutes tes données avaient été remontées dans une petite base de données, tu aurais pu faire n'importe quoi sans grande difficulté.

Là, tu réalises des opérations de base de données dans un fichier texte. C'est fort dommage, mais il n'est pas trop tard pour faire bien ;)
 
  • J’aime
Réactions: flotow
Bonjour,

pour compter les occurrences, essai:
awk '! /^[[:space:]]*$/ {print $(NF-12)}' monfichier | sort -f |uniq -c

ou en comptant depuis le début:
awk '! /^[[:space:]]*$/ {print $(8)}' monfichier.txt | sort -f |uniq -c
 
Dernière édition:
@daffyb

Le commencement :
J'ai monté un tout petit forum sur le theme du jeu KENO.
Au début les membres (9), postaient les pronos dans le forum.

J'ai trouvé sympa de pouvoir afficher le tirage (données extraites du site FDJ) et comparer les pronos des membres + leurs gains directement dans le forum d'une facon automatisée.
Grace a plusieurs d'entre vous, cela à été possible, grace a un script qui est lancé sur mon Mac a 14h15 et 21h15, puis envoi les résultats vers un FTP.

De ce FTP, le forum va chercher un JPG, un PDF, MP3 généré par le script.

Du coup, j'avance pas a pas dans ce petit projet perso.

Je n'ai pas pensé la réalisation avant.
J'ajoute quelques lignes de code (dont votre aide est essentielle), qui peuvent dans la limite du possible manipuler les datas existantes et créer de nouveau résultats affichables.

Mettre une base de données en place, je n'ai pas le niveau pour le faire, ca me semble encore plus compliqué.

D'un point de résultat, je trouve qu'un script peut faire plein de choses formidables :)

Peut être qu'on arrive a la limite possibilités d'un script.

Je voulais expliquer le "pourquoi comment" de l'évolution des choses :)



@Zeltron
Je vais tester tes commandes avec grand interet.
 
@daffyb

Le commencement :
J'ai monté un tout petit forum sur le theme du jeu KENO.
Au début les membres (9), postaient les pronos dans le forum.

J'ai trouvé sympa de pouvoir afficher le tirage (données extraites du site FDJ) et comparer les pronos des membres + leurs gains directement dans le forum d'une facon automatisée.
Grace a plusieurs d'entre vous, cela à été possible, grace a un script qui est lancé sur mon Mac a 14h15 et 21h15, puis envoi les résultats vers un FTP.

De ce FTP, le forum va chercher un JPG, un PDF, MP3 généré par le script.

Du coup, j'avance pas a pas dans ce petit projet perso.

Je n'ai pas pensé la réalisation avant.
J'ajoute quelques lignes de code (dont votre aide est essentielle), qui peuvent dans la limite du possible manipuler les datas existantes et créer de nouveau résultats affichables.

Mettre une base de données en place, je n'ai pas le niveau pour le faire, ca me semble encore plus compliqué.

D'un point de résultat, je trouve qu'un script peut faire plein de choses formidables :)

Peut être qu'on arrive a la limite possibilités d'un script.

Je voulais expliquer le "pourquoi comment" de l'évolution des choses :)



@Zeltron
Je vais tester tes commandes avec grand interet.
Je sais bien, car j'ai suivi et participé à tes posts.
Le passage à la base de données n'est pas plus compliqué que faire des scripts.
Jette y un oeil, ne serait ce que pour apprendre un nouveau truc.
 
@zeltron54

excellent :)

Capture_d_e_cran_2018_07_06_a_17_19_41.png
 
@zeltron54

J'ai légèrement modifié le code de base, afin de trier le rendu par ordre croissant, et mettre le resultat sur 1 seule ligne (retrait du de retour chariot)

Bloc de code:
awk '! /^[[:space:]]*$/ {print $(8)}' /Users/xxx/Desktop/KENODATA/RESULTATSHISTORIQUE.txt | sort -f |uniq -c | sort -r -n | tr -d '\n' > /Users/xxx/Desktop/KENODATA/RESULTATSTATS.txt

Capture_d_e_cran_2018_07_06_a_19_02_03.png
 
Ca ne me donne pas le total des gains en € (uniquement le nombre de grilles gagantes sur les 100 derniers tirages), mais c'est deja un début :)
 
@zeltron54

Dans ta commande "awk '! /^[[:space:]]*$/ {print $(8)}' /Users/xxx/Desktop/KENODATA/RESULTATSHISTORIQUE.txt | sort -f |uniq -c"
A quoi sert {print $(8)}' ?

merci

Vu que je peux pas effacer ce message- > c'est bon j'ai compris :)


J'ai essayé :
Bloc de code:
awk '! /^[[:space:]]*$/ {print $(8)} {print$(18)}' /Users/xxx/Desktop/KENODATA/RESULTATSHISTORIQUE.txt | sort -f

Je pensais que ca allait m'afficher
PSEUDO GAIN
PSEUDO GAIN
PSEUDO GAIN
PSEUDO GAIN
...

en réalité ca affiche
GAIN
GAIN
GAIN
GAIN
PSEUDO
PSEUDO
PSEUDO
etc...
 
Dernière édition:
Pour afficher plusieurs variables sur la même ligne :
Bloc de code:
printf "%s %s\n",variable1,variable2
Les %s seront remplacés par la variable
Le \n est le retour chariot unix
 
ecatomb, je comprends pas :-/

Bloc de code:
awk '! /^[[:space:]]*$/ {print $(8)} {print$(18)}' /Users/xxx/Desktop/KENODATA/RESULTATSHISTORIQUE.txt

me donne

ELSIE

ELSIE

ELSIE

MAGNETICO
30
MAGNETICO
2
ELSIE
5
ELSIE
5
ELSIE
2
ELSIE
2
MICROSEB
2


j'essai
Bloc de code:
awk '! /^[[:space:]]*$/ printf "%s %s\n",variable1,variable2 /Users/xxx/Desktop/KENODATA/RESULTATSHISTORIQUE.txt

ca donne rien, le terminal reste bloqué.

J'essai ca aussi
Bloc de code:
awk '! /^[[:space:]]*$/ printf "%s %s\n",$(8),$(18) /Users/xxx/Desktop/KENODATA/RESULTATSHISTORIQUE.txt

pas mieux LOL :)

En fait je vois pas ou faut placer -> printf "%s %s\n",variable1,variable2

Je voulais retirer le saut de ligne, j'ai essayé
Bloc de code:
tr '\n' ' ' < /Users/xxx/Desktop/RESULTATSTATS.txt > /Users/xxx/Desktop/RESULTATSTATS1.txt

Du coup, ca fonctionne mais, ca donne :
MAGNETICO 30 MAGNETICO 2 ELSIE 5 ELSIE 5 ELSIE 2 ELSIE 2 MICROSEB 2 MICROSEB 2 MICROSEB 2 MICROSEB 2 MICROSEB 2 MICROSEB 2 MICROSEB 2 MAGNETICO 2 ELSIE 5 ELSIE 5 ELSIE 5 ELSIE 5

Je voulais que les pseudo + gains soient les uns en dessous des autres.
 
Dernière édition:
Peux-tu poster une ligne de ton fichier source et ce que tu veux avoir à la place ? Je te donnerais la ligne à avoir (plus simple) ;)