Compter le nombre de caractères

Résolu
ani -  
 flavgnon -
Bonjour,je voudrais avoir une commande qui me permette de compter le nombre de caractères dans une ligne.Et l'afficher. Je précise que je travaille sous vi.
Configuration: Windows XP
Internet Explorer 7.0

12 réponses

Résumé de la discussion

Il s'agit de concevoir une commande capable de compter les caractères d'une ligne et de l'afficher, dans un contexte vi sous Windows XP et Internet Explorer 7. Des propositions privilégient l'usage d'outils comme awk et sed pour traiter les lignes et insérer des séparateurs, notamment awk -F',' '{SUM += $2} END {print SUM}' pour additionner la deuxième colonne. D'autres extraits démontrent comment générer le fichier fich1 en préservant son contenu existant et en plaçant le résultat sur la première ligne, tout en évitant d'écraser les données antérieures. En pratique, les solutions emploient souvent des combinaisons: nettoyage des lignes, suppression des blancs, puis concaténation du résultat, ce qui peut affecter le format final du fichier fich1.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    http://vim.dindinx.net/traduit/html/tips.txt.php#count-items

    ;-))
    0
    1. ani
       
      Salut.
      Merci pour ton aide. Mais au fait je voudrais une commande qui me permettrait ayant une chaine de chiffres, compter les 8 premiers chiffres et mettre une virgule entre le 8e et le 9e chiffre.
      Merci bcp.
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > ani
         
        :%s/.\{8\}/&,/
        ;-))
        0
      2. flavagnon Messages postés 5 Statut Membre > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Merci. C'est encore moi mais je voudrais savoir (excuse moi si mes questions sont un peu évidentes à ton gout) mais je ne vois nullement dans ton script ou il est spécifié le fichier sur lequel on dois intervenir. Aussi lorsque je l'excécute il s'affiche: ./essai: line 3: :%s/.{8}/: Aucun fichier ou répertoire de ce type
        ./essai: line 3: ,/: Aucun fichier ou répertoire de ce type
        Merci
        0
      3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > flavagnon Messages postés 5 Statut Membre
         
        C'est bien toi qui a dit : Je précise que je travaille sous vi
        J'ai pas rêvé ?

        Donc la commande s'exécute depuis ton fichier ouvert dans vi ;-))

        Sinon, avec "sed" :
        sed -i.bak 's/.\{8\}/&,/' fichier
        avec "ed" :
        ed -s fichier <<< $',s/.\{8\}/&,/g\nw'
        ;-))
        0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    dans vi taper
    8|
    pour se positionner à la huitième colonne
    0
  3. flavagnon Messages postés 5 Statut Membre
     
    Bonjour,
    Merci pour ton aide mais je voudrais un programme pour automatiser cette tache car j'aurais plusieurs fichiers ayant eux aussi plusieurs lignes et pour toutes ces lignes dans tous ces fichiers je voudrais insérer une virgule entre le 8e et le 9e chiffre.
    Merci d'avance
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      S'il n'y a que des lignes avec des chiffres dans tes fichiers, la solution données au post #5 avec "sed" ou "ed" fera très bien l'affaire...

      A part que si tu choisis l'option "-i" ou "-i.bak" de sed et de traiter tous les fichiers en bloc (fichier*), il te faudra rajouter l'option "-s" pour traiter chaque fichier individuellement et non comme un seul et même fichier.
      0
    2. flavagnon Messages postés 5 Statut Membre > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
       
      Merci infiniment c'est exactement ce que je cherchais.
      Maintenant ce que je voudrais bien, c'est de supprimer les chiffres de la 9e position à la 25e position de chaque ligne de ce fichier. Merci beaucuop.
      0
    3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > flavagnon Messages postés 5 Statut Membre
       
      Un exemple avant => après peut être ?

      Ou un truc du genre ferait l'affaire :
      [tmpfs]$ echo $var
      12345678AZERTYUIOPQSDFGH23456789
      
      [tmpfs]$ echo $var | sed 's/\(.\{8\}\)\(.\{16\}\)\(.*\)/\1,\3/'
      12345678,23456789
      
      [tmpfs]$
      ;-))
      0
    4. flavagnon Messages postés 5 Statut Membre > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
       
      Excuse moi mais je ne te comprend pas bien surement que je me suis mal expliquée.


      Tout simplement je voudrais passer de:

      125462389543594555
      989545565689421536


      A:

      1254623594555
      9895455421536


      A partir d'un bout de programme toujours sur le même fichier qu'auparavant

      Si tu vois bien les chiffres de la 7e à la 12e position ont été effacés
      0
    5. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > flavagnon Messages postés 5 Statut Membre
       
      [tmpfs]$ cat new_fich
      125462389543594555
      989545565689421536
      
      [tmpfs]$ sed 's/\(.\{7\}\).\{5\}\(.*\)/\1\2/' new_fich
      1254623594555
      9895455421536
      
      [tmpfs]$ 
      C'est mieux ? ;-))
      0
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Donne un exemple, histoire qu'on se comprenne bien ;-))
    0
    1. flavagnon
       
      Bon supposons que nous ayons:
      14 nom_fichier

      et que nous voulions
      14


      Au fat j'ai taper la commande "w -l nom_fichier" pour avoir le nombre de lignes du fichier nom_fichier mais moi, seul le nombre m'intéresse mais cette commande affiche aussi le nom du fichier. Je voudrais donc soit effacer le nom du fichier automatiquement ou avoir une commande qui n'affiche uniquement que le nombre de lignes de cet fichier.Merci
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    cat nom_fichier | wc -l
    0
    1. flavagnon
       
      Merci. A+
      0
    2. flavagnon
       
      Salut. J'ai un petit pépin.
      J'ai utilisé la commande que tu m'as indiquée et comme je voulais que le résultat (le nombre de lignes du fichier final) soit dans un fichier (fichier fich1) et qu'il y ai une virgule à la fin de la ligne ( après le nombre de lignes de fich1) j'ai fait ceci:
      cat final | wc -l > fich1 (Il compte le nombre de lignes de final et met cet nombre dans fich1)
      sed 's/$/,/g' fich1 >> fich1 (Il met un virgule à la fin de la ligne du fichier fich1)

      Cependant j'ai comme resultat dans le fichier fich1 ceci:
      nombre_de_ligne
      nombre_de_ligne,

      Or moi je voulais:
      nombre_de_ligne,

      Ce qui m'a conduit à écrire comme code:
      cat final | wc -l > fich1
      sed 's/$/,/g' fich1 > fich1
      J'ai enlevé une redirection mais lorsque j'ouvre mon fichier fich1 il n'y a rien dedans.

      Comment faire pour avoir dans mon fichier fich1
      nombre_de_ligne,

      Merci.
      0
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Essaye plutôt :
    cat final | wc -l | sed 's/$/,/' > fich1
    ;-))
    0
    1. flavagnon
       
      Merci ça marche à merveille.

      Si tu te rappelle de nos premières discussions j'avais voulu mettre une virgule entre le 8e et le 9e chiffre et mettre ,9,, à la fin de chaque ligne et ce pour toutes les lignes du fichier. Maintenant ce que je veux c'est de faire la somme de ces nombres qui sont entre la virgule et le signe ,99, et afficher le résultat à la suite de la somme des lignes du fichier final dans le fichier fich1.

      NB: Tout ces nombres sont dans le fichier final dont un exemplaire est le suivantt:
      01650426,4856622,9,,
      06630946,456484867466,9,,
      05426459,96512,9,,

      et il faut afficher la somme des éléments de la 2e colonne dans le fichier fich1 à la première ligne sans écraser ce que le fichier fich1 contenait.

      Merci
      0
  8. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    jp@MDK:~/tmpfs ssh$ cat fich
    blabla
    blabla
    ...
    ...
    blabla
    
    jp@MDK:~/tmpfs ssh$ cat final
    01650426,4856622,9,,
    06630946,456484867466,9,,
    05426459,96512,9,,
    
    jp@MDK:~/tmpfs ssh$ SOMME=$(awk -F',' '{SUM += $2} END { print SUM }' final)
    
    jp@MDK:~/tmpfs ssh$ echo $SOMME
    4,5649e+11
    
    jp@MDK:~/tmpfs ssh$  sed -i '1i\'"$SOMME"'' fich
    
    jp@MDK:~/tmpfs ssh$ cat fich
    4,5649e+11
    blabla
    blabla
    ...
    ...
    blabla
    
    jp@MDK:~/tmpfs ssh$
    ;-))
    0
    1. flavagnon
       
      Bonjour,
      Merci pour ton aide j'ai essayé le bout de programme que tu m'avais donnée mais lorsque j' excécute le progrmme on me dis:
      awk: command not found
      J'ai aussi essayé avec gawk mais c'est pareil.
      Je ne sais pas quel est le problème.
      Merci
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > flavagnon
         
        Que te renvoie les commandes suivantes :
        whereis awk gawk
        which awk gawk
        type awk gawk
        ?
        0
      2. flavagnon > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Salut,

        Excuse moi pour le temps d'attente mais comme tu me l'avais demandé voici ce que renvoi les commandes:

        $ whereis awk gawk
        awk: /bin/awk /usr/bin/awk /usr/libexec/awk /usr/share/awk /usr/share/man/man1/a
        gawk: /bin/gawk /usr/bin/gawk /usr/share/man/man1/gawk.1.gz

        $ which awk gawk
        /bin/awk
        /bin/gawk

        $ type awk gawk
        awk is /bin/awk
        gawk is /bin/gawk

        Merci
        0
  9. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Donc "awk" (et gawk) sont bien installés sur ton système, bizarre que tu aies cette erreur "awk: command not found " !? ;-\

    Tu peux afficher la commande (ou le script, enfin tout ce qui pourrait nous mettre sur la voie) que tu exécutes et la sortie générée (messages d'erreurs compris), parce que là à vue de nez, j'ai du mal ;-(
    0
    1. flavagnon
       
      Salut,
      Voici mon programme en entier:

      ################## PROGRAMME D ESSAI###############


      #!/bin/sh

      sed '/^ *$/d' ani > ani1

      sed 's/ //g' ani1 > ani2

      sed -i.bak 's/.\{8\}/&,/' ani2

      sed 's/$/,9,,/g' ani2 > ani3

      mv ani3 final

      rm ani*

      cat final | wc -l | sed 's/$/,/' > fich1

      somme=&{awk -F',' '{SUM += &2} END {print SUM}' final}

      echo &SOMME

      sed -i '1i\'"&SOMME"'' fich1

      cat fich1


      et lorsque je l'excécute voici ce qui s'affiche:

      [fanicette@ppsvasweb ~]$ ./prjt_num_mont.sh
      ./prjt_num_mont.sh: line 27: {awk: command not found

      ./prjt_num_mont.sh: line 29: SOMME: command not found
      &SOMME
      3,


      Merci
      0
    2. flavagnon
       
      Je precise qu'il devait s'afficher dans l'exemple que je viens de faire:
      3,125896
      0
  10. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Les erreur sont en gras ci-dessous :
    somme=&{awk -F',' '{SUM += &2} END {print SUM}' final}
    
    echo &SOMME
    
    sed -i '1i\'"&SOMME"'' fich1

    Voilà la bonne syntaxe :
    somme=$(awk -F',' '{SUM += &2} END {print SUM}' final)
    
    echo $somme
    
    sed -i '1i\'"$somme"'' fich1 
    ;-))
    0
  11. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    si je peux me permettre:
    somme=$(awk -F',' '{SUM += $2} END {print SUM}' final)
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Oups ;-((

      Thank you very mucho ;-))

      PS. J'avoue ne même pas avoir regardé la syntaxe de la commande avec awk ;-((
      0
      1. flavagnon > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Salut

        J'ai apporté les modifications mais voici ce qui apparait:


        ./prjt_num_mont.sh: line 36: ${awk -F',' '{SUM += $2} END {print SUM}' final}: bad substitution

        sed: -e expression n°1, caractère 1: \ attendu après `a', `c' ou `i'
        2,


        Merci de m'aider.
        0
      2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > flavagnon
         
        Affiche ta syntaxe en entier s'il te plaît, merci.

        Déjà pour le "sed", mets un espace après le \ et avant '
        ou fais carrément un retour à la ligne après le \
        0
      3. flavagnon > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Vioci la sytaxe en entier


        ############
        ####
        #!/bin/sh

        sed '/^ *$/d' ani > ani1
        #Enleve les lignes vides.

        sed 's/ //g' ani1 > ani2
        #Enleve les espaces entre les caracteres.

        sed -i.bak 's/.\{8\}/&,/' ani2
        #Met une virgule entre le 8e et le 9e chiffre.

        sed 's/$/,9,,/g' ani2 > ani3
        #Met les ,9,, a la fin de chaque ligne.

        mv ani3 final

        rm ani*
        #Supprime tous les fichiers commencant par ani.

        cat final | wc -l | sed 's/$/,/' > fich1
        #Affiche le nombre de numeros qui doivent subir le transfert de credit.

        #Somme des montants a transfere
        somme=${awk -F',' '{SUM += $2} END {print SUM}' final}

        echo $somme

        sed i '1i
        \'"$somme"'' fich1d

        cat fich1


        Merci
        0
  12. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Corrige cette partie comme ça :
    #Somme des montants a transfere
    somme=$(awk -F',' '{SUM += $2} END {print SUM}' final)
    
    echo $somme
    
    sed -i '1i\
    '"$somme"'
    ' fich1
    
    cat fich1


    0
  13. flavagnon
     
    Salut j'ai bien fait ce que tu m'as di mais bon ça ne marche toujours pas. Voici ce qui s'affiche:

    ./prjt_num_mont.sh: line 36: ${awk -F',' '{SUM += $2} END {print SUM}' final}: bad substitution

    2,

    Merci
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Non tu n'as pas fait ce que je t'ai dit (ou écrit du moins) !!!

      Entre le signe dollar ($) et la commande awk c'est une parenthèse ouvrante qu'il faut et non une accolade !
      Idem à la fin, remplace l'accolade fermante par une parenthèse fermante !

      La syntaxe d'une substitution de commande c'est :
      $(commande)

      et non pas :
      ${commande}


      Dont à la place de :
      ${awk -F',' '{SUM += $2} END {print SUM}' final}

      remplace par :
      $(awk -F',' '{SUM += $2} END {print SUM}' final)
      0
    2. flavagnon > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
       
      Salut j'espère que je ne t'emerde pas trop. Je voudrais savoir comment faire car j'aimerais mettre la somme de la 2e ligne à la suite du fichier présent (sur la meme ligne que les données présentent) et non pas au début du fichier. J'ai essayé avec
      >>
      et aussi avec
      tr 6d 'n' < fiich1 > fich2
      mais je n'ai pas eu de resultat
      Merci
      0
    3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > flavagnon
       
      N'ayant plus en tête les épisodes précédents concernant ton scripts et la flemme de tout me retaper, voilà un exemple que tu pourras adapter à ton cas sans trop de difficultés je pense :
      [tmpfs]$ cat fichier.txt
      ligne1
      ligne2
      ligne3
      ligne4
      ligne5
      
      [tmpfs]$ somme="222"
      
      [tmpfs]$ sed -i "2 s/.*/& ${somme}/" fichier.txt
      
      [tmpfs]$ cat fichier.txt
      ligne1
      ligne2 222
      ligne3
      ligne4
      ligne5
      
      [tmpfs]$
      ;-))
      0
    4. flavgnon > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
       
      Salut.
      Excuse moi encore mais je crois que je me suis mal exprimée.
      Tu m'as recement donné un script avec la commande awk pour pouvoir faire la somme de tous les nombres la 2e COLONNE d'un fichier nommé fich et le résultat s'affichait au début d'un fichier appelé fich1 et ce fichier fich1 contenait au paravant quelque chose.
      Ce que je veux maintenant c'est d'afficher la somme non pas au début du fichier mais à la suite du contenu du fichier fich1.
      Merci
      0
    5. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > flavgnon
       
      echo "$somme" >> fich1
      0