Shell compter caractère de chaque ligne

Résolu
Bonjour,

Je cherche une solution pour compter le nombre de caractères sur chaque ligne d'un fichier.

La solution wc me donne le nombre total de lignes et de caractères.

Ainsi la commande head -1 001_OUT_COM_VES_VESR_20080225211443864406.txt | wc -c va me donner le nb de caractère de la ligne 1 par exple.

J'ai tenté de m'orienter vers la solution
while read ligne ; do wc -c $ligne ; done < 001_OUT_COM_VES_VESR_20080225211443864406.txt

Mais, la commande interprete la variable $ligne comme un fichier. Est il possible de préciser que ce sont les caractères de la variable en sortie qu'il faut compter ?

Une autre solution serait de faire une boucle de type head -"x" fiicher | tail -"x-1" avec un renvoi vers un fichier temporaire dans lequel je compte le nb de caractères mais la solution me semble tortueuse ...

Est-ce que vous pouvez me suggérer une solution moins contraignante ?

Merci d'avance

Ps : j'ai hésité à mettre ce post dans programmation ...
Configuration: AIX 3 5

4 réponses

  1. man awk ça aide. :)

    utiliser awk qui parcour un fichier ligne par ligne et le traite avec la méthode length

    $0 désigne une ligne :)
    6
    1. Merci ! j'avais po pensé au awk ... j'espère que vous aurez apprécié ma solution tortueuse lol
      0
  2. Modérateur
    en fait ce qui est important c'est qu'il y a plusieurs solutions
    et vu ma paresse, bien sûr que je preferereais celle avec awk, puisqu'elle est trop courte

    pour s'amuser voici encore des solutions, cette fois avec perl ;-)
    perl -ne 'print length,"\n"' fichier.txt
    perl -ne 'print scalar(map {/./sg} $_),"\n"' fichier.txt
    perl -ne '$n=1;s/./++$n/eg;print $n,"\n"' fichier.txt
    3
    1. Modérateur
      Tout à fait l'ami ;-))
      0
  3. Modérateur
    Salut,
    while read ligne;do echo $ligne| wc -c;done < fichier.txt
    0
    1. Merci lami20j (si c'est bien ton vrai nom :-) )
      Cette me retourne des résultats incorrects :

      head -1 fichier.txt
      007121049191 xx xxxxxxxxxx xxxxxxx etc .......

      $ head -1 fichier.txt | wc -c
      262
      (262 caractères sur la 1ere ligne)

      Ta commande me retourne :
      19
      74
      73
      83
      73

      Ma solution tortueuse :

      NB_LIGNES=`wc -l $1|awk -F \ '{print $1}'`
      #echo "Le fichier $1 contient $NB_LIGNES lignes"
      NUM_LIGNE=1
      until [ "$NUM_LIGNE" = "$NB_LIGNES" ]
      do
      NB_CARACTERES=`head -$NUM_LIGNE $1 |tail -1|wc -c`
      echo "La ligne $NUM_LIGNE contient $NB_CARACTERES caracteres"
      NUM_LIGNE=`expr $NUM_LIGNE + 1`
      done

      echo "La ligne $NUM_LIGNE contient $NB_CARACTERES caracteres"

      verif_longueur.ksh fichier.txt :
      La ligne 1 contient 262 caracteres
      La ligne 2 contient 262 caracteres
      La ligne 3 contient 262 caracteres
      La ligne 4 contient 262 caracteres
      La ligne 5 contient 262 caracteres

      Je vais m'orienter vers le awk peut-être
      0
    2. merci lami20j pour dir salut
      0
    3. Cette solution est intéressante car elle ne dépend pas de programme externe qui ne sont as forcement présent (même si perl ou awk sont presque toujours installés).
      Mais il y a deux erreurs de programmation : la ligne peut contenir des espaces consécutifs, pour les préserver il faut protéger $ligne avec des quotes. La commande echo rajoute un retour chariot, donc ça fait + 1 sur chaque ligne...
      echo $ligne| wc -c
      Doit devenir: echo -n "$ligne" | wc -c

      Malheureusement l'option -n n'est pas portable sur tous les shell. On peut s'y prendre encore autrement en faisant un "moins 1"... mais c'est ch... embêtant. Surtout que faire un "moins 1" portable est assez verbeux aussi.
      0
    4. En lisant le commentaire suivant ^^ on peut faire
      > wc -L <<<"$ligne"

      Ca résout mon problème de "moins 1". Mais je redis qu'il faut des guillemets autour de la variable, c'est la raison principale du problème observé plus haut.
      0
    5. salut,

      Pas besoin de programme externe.
      le shell connaît le nombre de caractère d'une variable.

      while read line; do echo "\"$line\" : ${#line} chars"; done <fichier
      "a b c" : 5 chars
      "def" : 3 chars
      "gh i" : 4 chars
      0
  4. Modérateur
    Salut,

    pas besoin de awk pour faire ça
    0
    1. Oui mais ça reste une solution. En tout cas la tienne à l'air très bien. :)
      0
    2. Modérateur
      Salut lami20j,

      pas besoin de awk pour faire ça
      Si si awk est très bien pour ça :
      awk '{ print length($0) }' fichier
      ;-))
      0
    3. @jipicyOoooooooooooooooooooh quelle est belle cette solution !

      Merci !!!!!

      Par contre, ça ne compte pas le caractère de retour de fin de ligne ... mais ça n'a pas d'importance pour moi.

      Encore merci.
      0
    4. @JulesT'as vu ça j'suis pas étudiant en info système réseau pour rien lol. Et niveau shell script awk est un petit peu au centre de tout avec sed mais bien sûr je préfère awk de très loin héhé :) enfin bon j'ai pas laché la soluce comme ça non plus désolé. :/
      Mais j'ai un peu mis sur la voie.

      Le cours le plus important à retenir RTFM. En gros sous nux ça se résume souvent à man. :)
      0
    5. Modérateur
      @jipicyje n'ai pas dit qu'on ne peux pas utiliser awk ;-)
      0