Forum Programmation.shell Compter le nb d'occurence d'un caractere special dans un fichier

Posté par  .
Étiquettes : aucune
0
14
fév.
2006
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  . Évalué à 2.

    tr < ficchier.txt -d [\000-\001\003\255] | wc -c ?

    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  . Évalué à 1.

      Hum, l'idée est bonne, mais je n'arrive pas à réduire les caractère à supprimer à "tous sauf le caractere \002"...

      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  . Évalué à 1.

        et en doublant les \ ?
        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  . Évalué à 1.

          tr < textfile.txt -d [\\000\\001\\003-\\255] | wc -c

          pas mieux... :/
          • [^] # Re: euh tr et wc

            Posté par  . Évalué à 4.

            Salut,

            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  . Évalué à 1.

              MERCI!!!!!!

              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  . Évalué à 1.

              Et merde...

              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  . Évalué à 3.

                ReSalut !

                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  (site web personnel) . Évalué à 1.

                  Oui, et si ça ne fonctionne toujours pas, vérifier qu'il n'y a pas une commande tr sous /usr/xpg4/bin : certaines de commandes fournies sous /usr/bin par Solaris ont parfois un comportement différent de celui attendu ...
                • [^] # Re: Il faut faire simple

                  Posté par  . Évalué à 1.

                  Bonjour,

                  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.