OVH Cloud OVH Cloud

Pb grep

4 réponses
Avatar
mbfac
Bonjour

Pouvez-vous me confirmer que l'on ne peut pas compter le nombre d'occurences
avec l'option -c en perl contrairement à la ligne de commande
on est obligé de passer par system ?
ou y a t'il mieux pour compter le nombre d'occurences "toto" dans un fichier
/etc/titi.txt"
à priori $nb = grep ("-c" ,"toto" ,"/etc/titi.txt"); ne fonctionne pas
Merci de votre aide

Michel

4 réponses

Avatar
gerbier
mbfac wrote:
Bonjour

Pouvez-vous me confirmer que l'on ne peut pas compter le nombre d'occurences
avec l'option -c en perl contrairement à la ligne de commande
on est obligé de passer par system ?
ou y a t'il mieux pour compter le nombre d'occurences "toto" dans un fichier
/etc/titi.txt"
à priori $nb = grep ("-c" ,"toto" ,"/etc/titi.txt"); ne fonctionne pas


les commandes grep (unix) et grep (perl) sont de "faux-amis" : elles
n'ont pas la même syntaxe : cf perldoc -f grep et man grep

Avatar
Klaus
mbfac wrote:
Pouvez-vous me confirmer que l'on ne peut pas compter le nombre d'occuren ces
avec l'option -c en perl


on peut compter le nombre d'occurences avec l'option -c en perl (il
suffit de mettre le programme dans la section BEGIN{...} )

--- pour info, j'utilise Activestate perl 5.8.8 sous Windows XP ---

Par exemple, pour compter le nombre d'ocurrences d'une liste de 3
éléments ('a', 'b', 'c'):
======================
C:>perl -c -e "BEGIN{ my @liste = ('a','b','c'); print q{nombre
d'occurences = }, scalar(@liste), qq{n} }"
======================

résultat:
======================
nombre d'occurences = 3
-e syntax OK
======================

voir aussi: http://perl.enstimac.fr/DocFr/perlrun.html
======================
[...]
-c
indique à Perl de vérifier la syntaxe du programme et de sortir
ensuite sans l'exécuter. En fait, il va exécuter BEGIN, CHECK, et les
blocs use, car ils sont considérés comme existants en dehors de
l'exécution de votre programme. Les blocs INIT et END seront toutefois
passés.
[...]
======================

contrairement à la ligne de commande
on est obligé de passer par system ?


On n'est pas obligé de passer par système, on peut également mettre
l'option "-c" sur la ligne première ligne "#!C:Perlbinperl..." du
programme:

======================
#!C:Perlbinperl -c
BEGIN{
my @liste = ('a','b','c');
print q{nombre d'occurences = }, scalar(@liste), qq{n};
}
======================

ou y a t'il mieux pour compter le nombre d'occurences "toto" dans un fich ier
/etc/titi.txt"


Oui. Il faut virer l'option "-c" en perl qui sert uniquement à la
compilation.

Voici un programme pour compter le nombre d'occurences "toto" dans un
fichier "titi.txt":
======================
use strict;
use warnings;

my $nom = 'titi.txt';
my $cherche = 'toto';

my $nb_occ = 0;
my $nb_lig = 0;
my $nb_tot = 0;

open my $f, '<', $nom or die "Erreur: lecture fichier '$nom' ($!)";
while (<$f>) { my @w = /Q$chercheE/g;
$nb_tot++;
$nb_occ += @w;
$nb_lig++ if @w;
}
close $f;

print qq{Fichier concerne est "$nom"n};
print qq{Le nombre de lignes totale est $nb_totn};
print qq{Le nombre de lignes avec "$cherche" est $nb_lign};
print qq{Le nombre d'occurences "$cherche" est $nb_occn};
======================

voici le contenu du fichier "titi.txt":
======================
abc
toto fgkjfg toto dfsklqjs toto
titi
uuuuuu
tot
oto
toto
======================

voici le résultat:
======================
Fichier concerne est "titi.txt"
Le nombre de lignes totale est 7
Le nombre de lignes avec "toto" est 2
Le nombre d'occurences "toto" est 4
======================

à priori $nb = grep ("-c" ,"toto" ,"/etc/titi.txt"); ne fonctionne p as


Ce n'est pas la bonne syntaxe de "grep()", en fait, grep travaille sur
les listes et non pas sur les fichiers.

voir "grep()" dans "perlfunc":
http://perl.enstimac.fr/DocFr/perlfunc.html#item_grep

Avatar
mbfac
Merci

super tuto !

j'avais bien pensé a faire une boucle sur le fichier mais je pensais que
passer par grep serai peut etre plus rapide en plus comme je debute j'ai un
peu d'aprehension avec les {([ et autre

Cordialement

Michel BERTRAND
Avatar
Klaus
mbfac wrote:
j'avais bien pensé a faire une boucle sur le fichier mais je pensais que
passer par grep serai peut etre plus rapide en plus comme je debute j'ai un
peu d'aprehension avec les {([ et autre


Avec perl on peut également passer par une commande externe (comme,
par exemple "grep"):

Sauf sur mon système (Windows XP), je ne possède pas de "grep", mais
il y a une commande externe "find".

C:>find /c "toto" titi.txt
---------- TITI.TXT: 2

Donc je présente un exemple qui utilise la commande "find /c" (mais
ça devrait marcher pareil avec la commande "grep -c")

========================= ========
use strict;
use warnings;

my $nom = 'titi.txt';
my $cherche = 'toto';

open my $f, qq{find /c "$cherche" $nom |}
or die "Erreur: commande find /c $cherche $nom ($!)";

while (<$f>) {
if (/^-+s+([^:]+):s+(d+)/) {
print qq{Fichier "$1", nbr lignes avec "$cherche" est $2n};
}
}

close $f;
========================= ========

résultat:
========================= ========
Fichier "TITI.TXT", nbr lignes avec "toto" est 2
========================= ========