Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 06-02-2014 11:20:43

kao
Modérateur
Distrib. : Testing
Noyau : Linux 4.quelquechose
(G)UI : Gnome 3
Inscription : 28-09-2012
Site Web

Compter le nombre de fois qu'un caractère apparaît dans une chaîne.

Bonjour,
Je cherche à compter  le nombre de fois qu'un caractère apparaît dans une chaîne.

Je m'explique, j'ai extrait d'un fichier csv un champ pour chaque ligne:

BatimentA>Etage1>Salle1
BatimentA>Etage4>Salle2
BatimentA>Etage1
BatimentB


Je souhaiterais donc compter le nombre '>' afin de savoir à quelle profondeur je me trouve.
0 fois le caractère > je suis en niveau 1
1 fois le caractère > je suis en niveau 2
2 fois le caractère > je suis en niveau 3

Connaissez vous quelque chose qui pourrait faire ça?
Cordialement,
Kao

Hors ligne

#2 06-02-2014 11:53:00

kao
Modérateur
Distrib. : Testing
Noyau : Linux 4.quelquechose
(G)UI : Gnome 3
Inscription : 28-09-2012
Site Web

Re : Compter le nombre de fois qu'un caractère apparaît dans une chaîne.

Bon en fait, ce que j'essaye de faire c'est un compteur de mot, du coup, je remplace les > par des espaces et il n'y a plus qu'a compter:

echo "BatimentA>Etage1>Salle1" | sed 's/>/ /g' | wc -w


Comme je n'ai pas d'espace dans mes noms, je devrais m'en sortir

Hors ligne

#3 06-02-2014 11:56:38

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : Compter le nombre de fois qu'un caractère apparaît dans une chaîne.

Solution alternative :

echo "BatimentA>Etage1>Salle1" | sed 's/[^>]//g' | awk '{print length+1}'


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#4 06-02-2014 13:09:45

GuilOooo
Membre
Distrib. : Debian Stable
Noyau : Noyau par défaut de Stable
(G)UI : DWM
Inscription : 04-05-2013

Re : Compter le nombre de fois qu'un caractère apparaît dans une chaîne.

Si tu as des espaces dans les noms, tu peux simplement permuter les '>' et les '\n', puis compter les lignes de la sortie :

echo "Bâtiment A>Étage 42>Salle 1337" | tr '\n>' ' \n' | wc -l



renvoie bien 2.

EDIT : pour le coup, j'ai simplement compté les '>' et j'ai oublié d'ajouter le 1. Ce qui nous donne…

echo "Bâtiment A>Étage 42>Salle 1337" | tr '\n>' ' \n' | wc -l | perl -e 'print <>+1'



mais bon, quitte à mettre du Perl là-dedans, autant bricoler un one-liner en Perl dès le départ. tongue

EDIT 2 : bon, je ne résiste pas…


echo "Bâtiment A>Étage 42>Salle 1337" | perl -e "$|=1;$/=undef;@c=(<>=~/>/g);print @c+1"
 



amusez-vous bien ! smile

Dernière modification par GuilOooo (06-02-2014 13:22:47)

Hors ligne

#5 06-02-2014 14:47:45

kao
Modérateur
Distrib. : Testing
Noyau : Linux 4.quelquechose
(G)UI : Gnome 3
Inscription : 28-09-2012
Site Web

Re : Compter le nombre de fois qu'un caractère apparaît dans une chaîne.

Comme je n'ai pas d'espace je m'en sors mais je note, au cas ou, merci

Hors ligne

#6 06-02-2014 19:50:21

Slyfox
Membre
Lieu : Pays du chocolat
Distrib. : GNU/Linux Debian Sid
Noyau : Linux 4.7.0-1-amd64
(G)UI : MATE
Inscription : 15-12-2013

Re : Compter le nombre de fois qu'un caractère apparaît dans une chaîne.

Bonjour les amis smile

@ kao

Voilà j'espère que ça répond à ton attente...

awk '{cnt=0 ; for(i=1; i<=NF; i++) {if($i != "") {cnt++}} {print "ligne",NR,": je suis au niveau "cnt}}' FS=">" "/home/$USER/fichier_a_analyser.txt"



Amicalement Slyfox

Hors ligne

#7 06-02-2014 20:58:06

Slyfox
Membre
Lieu : Pays du chocolat
Distrib. : GNU/Linux Debian Sid
Noyau : Linux 4.7.0-1-amd64
(G)UI : MATE
Inscription : 15-12-2013

Re : Compter le nombre de fois qu'un caractère apparaît dans une chaîne.

Une autre possibilité...

echo "BatimentA>Etage1>Salle1
BatimentA>Etage4>Salle2
BatimentA>Etage1
BatimentB"
|
awk '{cnt=0 ; for(i=1; i<=NF; i++) {if($i != "") {cnt++}} {print "ligne",NR,": je suis au niveau "cnt}}' FS=">"

Dernière modification par Slyfox (06-02-2014 21:18:56)

Hors ligne

Pied de page des forums