IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Nombre d'espaces par ligne


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut Nombre d'espaces par ligne
    Bonjour,

    J'aimerai connaître le nombre d'espaces qui se suivent dans un texte par ligne, mais uniquement quand j'ai au moins 2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    première ligne  avec mes     espaces
    ligne  deux avec des       es      paces aussi
    Et en retour j'aimerai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1:2 espaces
    1:5 espaces
    2:2 espaces
    2:7 espaces
    2:6 espaces

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour,

    es-tu sûr de la finalité ? Car, s'il existe le caractère espace, il existe aussi le caractère tabulation ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo "première ligne  avec mes     espaces
    ligne  deux avec des       es      paces aussi"|sed 's/@//g;:z;s/  /@ /;t z;s/[^ @]//g'
     @  @@@@
    @   @@@@@@ @@@@@
    Y a plus qu'à compter les arobases en ajoutant 1 à chaque groupe.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Bonjour,
    Pas la plus optimum, mais voici une façon de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ cat nb_space
    première ligne  avec mes     espaces
    ligne  deux avec des       es      paces aussi
    $ i=0;while read ligne; do ((i++)); echo -e "${ligne// /\n}" | uniq -c | grep '[0-9] $' | while read n ; do echo ${i}:$((++n)) ; done; done <nb_space
    1:2
    1:5
    2:2
    2:7
    2:6
    Cordialement.

  4. #4
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    Merci pour vos réponses.
    disedorgue sur ton exemple, j'ai l'impression que ça compte tous les espaces de chaque ligne.
    Peut-être je me suis mal exprimé, mais ce sont les espaces à la suite uniquement qui m'intéressent. Au moins une suite de 2 espaces, les simples espaces ne doivent pas apparaîtrent

  5. #5
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Hum. Son résultat est totalement identique au tien...

    L'idée de passer par uniq est excellent. Dommage qu'il faille le numéro de ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sed 's/./&\n/g' nb_space|uniq -dc|grep -v ' [0-9]\+ [^ ]'
          2
          5
          2
          7
          6
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Ce qui donne cette impression, c'est que je remplace tous les espace par un retour à la ligne, mais dans les faits pour uniq c'est le marqueur de fin de ligne, il ne reste plus qu'a compter le nombre de ligne vide consécutive auquel on fait +1 puisque l'on perd le premier espace.
    En fait, il y a juste un petit cas qui pose problème: si la ligne commence par un ou plusieurs espaces, alors si un, il en comptera 2, si plusieurs, alors il en comptera un de trop.
    Pour résoudre ce cas, il suffit juste de supprimer l'espace éventuel qui commence la ligne...
    Cordialement.

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    Justement, il se peut que j'aie une tabulation en début de ligne, ou même plusieurs espaces qui doivent être identifiés.
    Même en fin de ligne, il se peut que j'ai quelques espaces que j'aimerai voir.

  8. #8
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Voici le correctif, qui prend en compte tout type d'espace et corrige le problème de l'espace au début.
    Une tabulation est vu comme un seul espace.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ i=0;while read ; do ((i++)); ligne="${REPLY#[[:space:]]}"; echo -e "${ligne//[[:space:]]/\n}" | uniq -c | grep '[0-9] $' | while read n ; do echo ${i}:$((++n)) ; done; done <nb_space
    Cordialement.

  9. #9
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    Je suis vraiment désolé de faire mon chieur, mais il se peut que j'aie plusieurs tabulation au début ou même en fin, il faudrait qu'elle ne soient pas du tout prises en compte en fait

  10. #10
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Puisque tu vas jusqu'au bout, je vais jusqu'au bout:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ sed 's/@//g;:z;s/  /@ /;t z;s/[^ @]//g' nb_space| awk -F'[^@]' '{for (i=1;i<=NF;i++) if (length($i)>0) print FNR":"(length($i)+1);}'
    1:2
    1:5
    2:2
    2:7
    2:6
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  11. #11
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut awk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ echo "première ligne  avec mes     espaces
    ligne  deux avec des       es      paces aussi"|
    awk 'BEGIN{ FS = "[^ ]*" }{ for(i = 1 ; i <= NF ;i++){ if ( length($i) > 1 )  print NR":"length($i) ; } ; } '
    1:2
    1:5
    2:2
    2:7
    2:6

  12. #12
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    Ouah ! Ça marche impeccable.
    Une dernière chose, est-ce possible de ne pas prendre en compte les lignes qui commençent par des "#", mais au final, de les compter quand même dans les lignes du fichier.

    J'ai essayé sur mon fichier (mais j'avais oublié qu'il y avait des commentaires) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat r | grep -v "#" | awk 'BEGIN{ FS = "[^ ]*" }{ for(i = 1 ; i <= NF ;i++){ if ( length($i) > 1 )  print NR":"length($i) ; } ; } '
    Mais comme j'enlève les lignes avec "#", les numéros de ligne du résultat sont décalées

    Avec l'exemple modifié ça ferait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $ echo "première ligne  avec mes     espaces
    #une qui compte pas
    #une autre
    ligne  deux avec des       es      paces aussi"
    donnerait =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1:2
    1:5
    4:2
    4:7
    4:6

  13. #13
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut en rajoutant la selection idoine devant l'action
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ echo "#première ligne  avec mes     espaces
    ligne  deux avec des       es      paces aussi"|
    awk 'BEGIN{ FS = "[^ ]*" }/^[^#]/{ for(i=1;i<=NF;i++){if(length($i)>1) print NR":"length($i);};}'
    2:2
    2:7
    2:6

  14. #14
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    C'est super merci beaucoup beaucoup.
    Toute dernière question, pour mon info personnelle, si le # est juste contenu dans la ligne et pas forcément au début ?
    Encore mille merci

  15. #15
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut
    tu pourrais dans ce cas supprimmer avec sed tout ce qui se trouve entre # et fin de ligne et rediriger la sortie vers le awk sans la selection devenue inutile

  16. #16
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    J'ai mal formulé je pense.
    Si le # est dans la ligne au lieu d'être au début, mais ce qui fait que je veux annuler la ligne complètement comme si il était au début (et non juste à partir du #)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    echo "première         lign#e  avec mes     espaces
    ligne  deux avec des       es      paces aussi"|
    awk 'BEGIN{ FS = "[^ ]*" }/^[^#]/{ for(i=1;i<=NF;i++){if(length($i)>1) print NR":"length($i);};}'
    2:2
    2:7
    2:6

  17. #17
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut
    alors la tu remplaces : commence par autre chose que #
    par : ne trouve pas #

  18. #18
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    OK il me manque le "!/"
    Merci beaucoup encore !

  19. #19
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    J'ai quand même un petit bug sur une ligne dans mon fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bash-3.2$ echo 'echo "Aucune ligne vide à la fin du fichier"' | awk 'BEGIN{ FS = "[^ ]*" }{ for(i = 1 ; i <= NF ;i++){ if ( length($i) > 1 )  print NR":"length($i) ; } ; } '
    1:3
    Petite question :
    Si je ne veux pas prendre en compte les lignes qui contiennent au moins deux # (par forcément côte à côte, et pas forcément au début ou à la fin, juste deux # n'importe ou dans la ligne) ?

    J'ai testé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN{ FS = "[^ ]*" }!/#/{2}{ for(i=1;i<=NF;i++){if(length($i)>1) print NR":"length($i);};}'
    Sans succès

  20. #20
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    La première commande marche correctement chez moi (elle n'affiche rien).
    La seconde que tu as testée n'a aucun sens.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XSLT] Créer un tableau HTML en fixant le nombre de cases par ligne
    Par kingmandrax dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 03/07/2006, 16h07
  2. limiter le nombre d'images par ligne
    Par cyrill.gremaud dans le forum Langage
    Réponses: 16
    Dernier message: 04/05/2006, 11h46
  3. [JTextArea] Limiter nombre de caractères par lignes
    Par doudine dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 17/02/2006, 17h26
  4. Limiter le nombre de caractère par ligne d'un textarea
    Par rantanplan08 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 04/01/2006, 19h31
  5. nombre de caractères par ligne à l'affichage
    Par trotters213 dans le forum Oracle
    Réponses: 3
    Dernier message: 03/11/2005, 09h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo