[bash] Position d'un mot ds un fichier

Résolu/Fermé
tibofx Messages postés 14 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 23 janvier 2008 - 3 janv. 2008 à 15:47
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 3 janv. 2008 à 20:19
Bonjour,
Je viens de passer pas mal de temps à écrémer les forums, mais je ne trouve pas de réponse à mon problème..que voici :
J'ai un fichier texte contenant un texte de la forme suivante :
windows 2 sun 1 descendent 5 ...fire 1... etc..
Et ce que je voudrais, c'est que si je cherche un mot, afficher le nombre qui le suit. Par exemple, ici : je cherche le mot "fire". Il est présent, donc j'affiche le nombre qui le suit, soit le 1.
Merci pour votre aide !
Tibo.
A voir également:

6 réponses

Darkito Messages postés 1191 Date d'inscription vendredi 7 décembre 2007 Statut Membre Dernière intervention 26 mai 2010 545
3 janv. 2008 à 15:59
Bonjour,
tu peux essayer en faisant un grep "tonMot" pour récupérer la ligne.
ensuite tu reconnait "tonMot" et tu prends le mot suivant.

ligne=`grep "$tonMot" tonFichier | head -1` //tu récupères la 1ere occurence

res=${ligne##*$tonMot } //tu supprimes le début de la ligne, le premier mot est alors le chiffre que tu cherche

set $(echo $res $1)
res=$(eval echo $1) // tu récupères le 1er mot

echo $res


C'est vraiment laid mais ca fonctionne...
--
Tøƒ
0
tibofx Messages postés 14 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 23 janvier 2008
3 janv. 2008 à 16:32
Merci pour ta réponse si rapide ! Cependant lors de la dernière assignation de la variable res, je suppose qu eça me coupe tout le contenu de res puisqu'ensuite il ne m'affiche absolument rien, ou plutot comme si c'était un retour chariot lorsque je j'affiche sa valeur.
0
Darkito Messages postés 1191 Date d'inscription vendredi 7 décembre 2007 Statut Membre Dernière intervention 26 mai 2010 545
3 janv. 2008 à 16:37
Il manquait un "$" devant "tonMot" dans le grep, l'erreur vient peut être de là...
sinon, rajoute des "echo $ligne", "echo $res" pour voir le processus.
--
Tøƒ
0
tibofx Messages postés 14 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 23 janvier 2008
3 janv. 2008 à 16:41
Yes ! Merci beaucoup, c'est peut-être laid mais en effet c'est exactement ce que je voulais ! Quelle rapidité ! Merci beaucoup !
0
Darkito Messages postés 1191 Date d'inscription vendredi 7 décembre 2007 Statut Membre Dernière intervention 26 mai 2010 545
3 janv. 2008 à 16:44
De rien,
Tu as eu de la chance, je suis en plein en train d'utiliser des fonctions de ce genre donc j'avais tous ce qu'il fallait sous la main.
--
Tøƒ
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
3 janv. 2008 à 17:03
Salut,

Un peu à la bourre, mais... (Attention : Il ne faut pas d'espace entre les 2 premiers crochets ([) qui entourent le terme "digit" !!! Ici l'espace c'est pour contrer la mise en forme des balises < code > qui empêche un affichage correct (réservé) :
$ echo $A
windows 2 sun 1 descendent 5 ...fire 1...

$ echo $A | grep -o "fire [0-9][0-9]*" | grep -o '[ [:digit:]]'
1

$ echo $A | egrep -o "windows [0-9][0-9]*" | grep -o '[ [:digit:]]'
2
;-))
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tibofx Messages postés 14 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 23 janvier 2008
3 janv. 2008 à 17:07
Merci jipicy, c'est jamais trop tard pour apprendre ! Je ne suis pas encore sorti de l'auberge, donc tout est bon à prendre pour moi ! Merci encore j'ai vraiment besoin d'avancer dans ce domaine !
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
3 janv. 2008 à 20:19
Un petit exemple supplémentaire avec "sed" cette fois :
$ echo "$A"
windows 2 sun 1 descendent 5 ...fire 1...
linux 6 bsd 4 aix 1 mac 3
firefox 2 thunderbird 1 sunbird 2

$ echo "$A" | sed -n '/.*fire \([0-9]\{1,\}\).*/ s//\1/p'
1

$ echo "$A" | sed -n '/.*linux \([0-9]\{1,\}\).*/ s//\1/p'
6

$ echo "$A" | sed -n '/.*bsd \([0-9]\{1,\}\).*/ s//\1/p'
4
;-))
0