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 :

Rajout du caractére "000000" sur chaque fin de ligne de mon fichier, limité à 1500


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    Par défaut Rajout du caractére "000000" sur chaque fin de ligne de mon fichier, limité à 1500
    Bonjour,

    J'ai un fichier test contenant plusieurs lignes.
    zone;4ppp;pppp;;p;;;;
    zone8;h;;hhhh;;;;hhhh;
    cumul;ftgg;trttt;tyyy;yyy;ppp;pppp;;;;kkkkk;;

    A la fin de chaque ligne, je souhaiterait rajouter la valeur 0, plusieurs fois de suite, jusqu'à atteindre 50 caractères par ligne

    exemple :
    zone;4ppp;pppp;;p;;;;000000000000000000000000000
    zone8;h;;hhhh;;;;hhhh;00000000000000000000000000
    cumul;ftgg;trttt;tyyy;yyy;ppp;pppp;;;;kkkkk;;00000000

    Merci pour votre aide.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 389
    Points
    19 389
    Par défaut
    Bonjour,

    tu as quelque chose à proposer ?
    sur quoi tu bloques ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    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

    • Soit tu utilises sed, et tu fais un ajout de 0 jusqu'à repérer une chaîne de 50 caractères. (saut conditionnel)
    • Soit tu utilises awk, et tu affectes 0 à $i, dans une boucle qui va, pour i, de NF+1 à 50.


    Elle est pas belle la vie ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 389
    Points
    19 389
    Par défaut
    il y a "plus simple", et plus rapide peut-être, en shell et avec printf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf -v zeros '0%.s' $(seq $((${#ligne}+1)) 50)
    echo "$ligne$zeros"
    modulo quelques tests...
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    Par défaut
    comment je peux faire cela avec un cat test | .....

    Merci pour votre aide

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Pour le fun, en pure built-in bash:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read a ; do [[ 50 -gt ${#a} ]] && printf "%s%0$((50-${#a}))i\n" "$a" || printf "%s\n" "$a" ; done <fichier
    Cordialement.

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 389
    Points
    19 389
    Par défaut
    attention, dans la commande test ([), ou [[, > est un opérateur lexical : il compare du texte, pas des nombres.
    l'équivalent arithmétique est -gt.

    sinon, je plussoie.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Yes , j'ai modifié...

    Au départ, je voulais être joueur et donner ce faux résultat (qui en jette sur un terminal ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf "00000000000000000000000000000000000000000000000000\r%s\n" `<fichier`
    Cordialement.

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Ouahhh, plus de 1800 affichages en moins de 24 heures
    Cordialement.

  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
    Pour un exercice auquel on a déjà répondu les années précédentes, si ma mémoire est bonne.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  11. #11
    Futur Membre du Club
    Inscrit en
    Juin 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    On peut pas faire cela avec un cat sans passer ligne par ligne

  12. #12
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    C'est bien beau mais je l'incremente comment printf -v zeros '0%.s' $(seq $((${#ligne}+1)) 50)
    echo "$ligne$zeros" pour tester mon fichier.

    Merci

  13. #13
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Exactement de la même façon que je donne au post #6 (qui fait d'ailleurs le job sur un fichier complet).

    Et non, on ne peut pas le faire uniquement avec cat mais une solution awk ou sed comme déjà dit par Flodelarab, est tout à fait possible...
    Cordialement.

  14. #14
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    Par défaut
    Bonjour ,

    Lorsque je lance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #!/usr/bin/ksh
     cat ${UnFichier} | while read UneLigne
            do
                    echo ${#UneLigne}
     
                    if [ ${NbreMaxCar} -gt ${#UneLigne} ] ; then
                            printf "%s%0$((${NbreMaxCar}-${#UneLigne}))i\n" "$UneLigne" >> ${UnFichier}.tmp_1
                    else
                            echo "Erreur Ligne superieur a $NbreMaxCar  caracteres"
                            printf "%s\n" "$UneLigne"                                   >> ${UnFichier}.tmp_1
                    fi
     
            done

    J'ai le message d'erreur suivant : printf: i: unknown format specifier

    mais je suis obligé de le lancer en ksh.
    Merci pour votre aide

  15. #15
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    Par défaut
    de meme si dans mon fichier de départ, j'ai un espace en début de ligne, il le supprime. Or je ne souhaite pas qu'il soit supprimé.

    Merci pour vos réponses.

  16. #16
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Le bash est plus permissif que le ksh:

    En bash, on peut:
    Mais en ksh, il faut être explicite, donc l'équivalent est:
    ici, je te laisse voir comment corriger dans ton script car le but est tout de même de comprendre comment ça fonctionne...

    Pour l'histoire de l'espace, soit tu utilises la variable par défaut de read ( $REPLY ) sans la nommer sur la ligne du read, donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat ${UnFichier} | while read
    Ou alors, tu spécifies l'IFS pour pouvoir utiliser ta propre variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat ${UnFichier} | while IFS="" read UneLigne
    PS: ici, on spécifie l'IFS juste pour read, si on le met juste avant le while, il sera spécifié pour tout le bloc...
    Cordialement.

  17. #17
    Futur Membre du Club
    Inscrit en
    Juin 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Merci je vais tester.

  18. #18
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Points : 5 915
    Points
    5 915
    Par défaut
    Avec awk

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     awk '{ while ( length($0) < 50 ) $0=$0"0" ; print $0 }' fichier.txt

  19. #19
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    +1
    Une alternative:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F "" '{$0=NF < 50 ? sprintf("%s%0"50-NF"i",$0,0) : $0}1' fichier.txt
    Cordialement.

Discussions similaires

  1. rajouter une virgule à chaque fin de ligne d'un .txt
    Par mozzlo dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 02/12/2009, 13h06
  2. Réponses: 22
    Dernier message: 10/02/2007, 12h02

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