Bonjour,
je souhaite compter le nb de fois où un caractere spécifique est present dans un fichier plat.
Le caractere est le code ascii '02' et se situe en fin de ligne normalement.
J'utilise donc la regexp /(.*)\002$/ pour mon comptage.
En perl, le script suivant marche et me donne le resultat attendu:
[code]
#!/usr/bin/perl -w
$i = 0;
open(FH, "Mon_Fichier_A_Lire") or die "plop";
while ()
{
if ($_ =~ /(.*)\002$/)
{
$i++;
}
# print $_;
}
close (FH);
print "Nombre d'occurences trouvees : $i\n";
[/code]
En shell, je n'y arrive pas par contre... (et il me faut une solution en shell...:'( ).
[code]
#/bin/ksh
grep -e '/(.*)\002$/' "Mon_Fichier_A_Lire"
[/code]
Toute suggestion est la bienvenue...
Merci!
# euh tr et wc
Posté par fearan . Évalué à 2.
tr -d détruit tout ce que tu ne veux pas compter, wc -c compte ce qui reste
Il ne faut pas décorner les boeufs avant d'avoir semé le vent
[^] # Re: euh tr et wc
Posté par Paddle . Évalué à 1.
J'ai essayé avec [\000\001\003-\255] et ca me sort une erreur:
tr: range-endpoints of `3-2' are in reverse collating sequence order
[^] # Re: euh tr et wc
Posté par fearan . Évalué à 1.
j'ai tappé un peu vite...
Il ne faut pas décorner les boeufs avant d'avoir semé le vent
[^] # Re: euh tr et wc
Posté par Paddle . Évalué à 1.
pas mieux... :/
[^] # Re: euh tr et wc
Posté par JJD . Évalué à 4.
tr -d "\000\001[\003-\377]" < textfile.txt | wc -c
Explications :
- on redirige l'entrée depuis un fichier (< textfile.txt) APRÈS avoir mis les options.
- tr prend en option une chaîne de caractères : donnons lui donc une chaîne (entre simples ou doubles quotes)
- on n'utilise les crochets que pour indiquer une classe de caractères ou un intervalle
- avec la notation \XXX, XXX est en OCTAL : les valeurs vont donc de 000 (0 en décimal) à 377 (255 en décimal).
Mais, c'est quand même bien d'essayer d'apprendre ;-)
A+
JJD
[^] # Re: euh tr et wc
Posté par Paddle . Évalué à 1.
Ca marche impec!
Tu es mon sauveur!
:))))
Et oui, j'essais d'apprendre, mais parfois, la route est longue :p
[^] # Re: euh tr et wc
Posté par Paddle . Évalué à 1.
J'ai parlé trop vite :'(
Ta soluce marche impec sous Linux, mais sous Unix (SunOS) ca marche plus...
Ouinnn! Je vais me suicider aujourd'hui ;)
Bon, je retourne voir le man!
Merci quand même!
[^] # Il faut faire simple
Posté par JJD . Évalué à 3.
Mon message précédent reprenait les tentatives malheureuses des posts juste avant pour donner une solution, avec les explications, fonctionnant sous linux (on est quand même sur LinuxFR), c'est à dire avec le tr GNU qui, comme beaucoup d'outils GNU, étend assez fortement le comportement "standard" de la commande.
Quoi qu'il en soit, on peut faire beaucoup plus simple et efficace en utilisant l'option -c (complément) :
tr -d -c "\002" <textfile.txt | wc -c
C'est quand même plus joli comme ça et ça devrait marcher sur tous les Unices (j'ai en tout cas pu tester sur AIX)
Bonne soirée,
JJD
[^] # Re: Il faut faire simple
Posté par LeSeb (site web personnel) . Évalué à 1.
[^] # Re: Il faut faire simple
Posté par Paddle . Évalué à 1.
Merci pour ton aide.
Effectivement, en utilisant le complement, la commande marche désormais parfaitement sous SunOs (5.9 sur Sparc sun-fire-v440).
Et elle est nettement plus propre que le "contournement" que j'avais mis en place du coup:
Faire la difference entre la commande "normale" (qui marchait sous linux/pas sous unix) et la même commande en enlevant aussi mon caractere special recherché (mais qui me laissait donc les caracteres parasites faussant le calcul sous unix). Ca marchait, mais bon, y avait effectivement plus simple :p
val1=$(tr -d '\000\001[\003-\377]' < fichier.txt | wc -c)
val2=$(tr -d '[\000-\377]' < fichier.txt | wc -c)
let val =$val1-$val2
Merci a tous en tout cas :)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.