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 :

Intégration de caractéres dans une ligne


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 Intégration de caractéres dans une ligne
    Bonjour,

    J'ai un fichier test1 , dans lequel je souhaite rajouter la même chaine de caractére pour chaque ligne " 001 TEST " pour créer mon fichier test2, à partir de mon 12 ième caractére de début de ligne , en rajoutant la chaine sur 20 caractères " 001 TEST " et intercaler la suite sur cette même.

    fichier test1 :TOKAS180630 MACHINE A 00000
    TOKAS180630 MACHINE A 00000
    TOKAS180630 MACHINE B 0000044444

    Fichier test 2:
    TOKAS180630 001 TEST MACHINE A 00000
    TOKAS180630 001 TEST MACHINE B 0000044444

    Le fichier est assez volumineux. Il faudrait quelques chose de simple.

    Dans un précedent script, j'avais rajouté des fins de lignes par des 0. (voir ci-dessous). Mais là je cale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    #----------------------------------------------------------------------------------------
    #--Rajout des caracteres 0 en fin de lignes pour combler les blancs sur 1500 caractere---
    #----------------------------------------------------------------------------------------
    cd ${RepOut}
    echo "Chemin Out : ${RepOut}"
    NbreMaxCar=1499
    ls *MACHINE* 2>/dev/null | egrep -v "CRA" | while read UnFichier
    do
            cat ${UnFichier} | while IFS="" read UneLigne
            do
     
                    if [ ${NbreMaxCar} -gt ${#UneLigne} ] ; then
                            printf "%s%0$((${NbreMaxCar}-${#UneLigne}))i\n" "$UneLigne" >> ${UnFichier}.tmp
                    else
                            echo "Erreur Ligne superieur a $NbreMaxCar  caracteres"
                            printf "%s\n" "$UneLigne"                                   >> ${UnFichier}.tmp
                    fi
     
            done
     
            mv ${UnFichier}.tmp ${UnFichier}
    done

    Merci pour votre aide.

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    un grand classique, 1 ligne de sed et c'est marre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -r 's/^(.{12})(.+)/\1 001 TEST \2/' fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ sed -r 's/^(.{12})(.+)/\1 001 TEST \2/' <<EOF
    > TOKAS180630 MACHINE A 00000
    > TOKAS180630 MACHINE A 00000
    > TOKAS180630 MACHINE B 0000044444
    > EOF
    TOKAS180630  001 TEST MACHINE A 00000
    TOKAS180630  001 TEST MACHINE A 00000
    TOKAS180630  001 TEST MACHINE B 0000044444

  3. #3
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Bonjour,

    J'approuve totalement la méthode de BufferBob.

    Après en bash, tu as aussi la méthode suivante qui s'insère très bien dans le script que tu donnes, mais beaucoup plus lent que via sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ UneLigne='TOKAS180630 MACHINE A 00000'
    $ echo "${UneLigne::12} 001 TEST ${UneLigne:12}"
    TOKAS180630  001 TEST MACHINE A 00000
    Cordialement.

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    et puisqu'on en parle :
    Citation Envoyé par vince2005 Voir le message
    Le fichier est assez volumineux
    sed n'est même pas la meilleure approche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ time sed -r 's/^(.{12})(.+)/\1 001 TEST \2/' fichier > /dev/null
    real    1m3.374s
     
    $ time perl -ne 'print $1."001 TEST ".$2 if m/^(.{12})(.+)/' fichier > /dev/null
    real    0m15.848s
     
    $ time awk '{print substr($0,1,12) "001 TEST" substr($0, 12)}' fichier > /dev/null
    real    0m10.386s
     
    $ time perl -ne 'print substr($_, 0, 12) . "001 TEST " .substr($_, 12)' fichier > /dev/null
    real    0m6.588s

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Je suis étonné du temps de sed (qui reste tout de même meilleurs que la solution bash)...

    Sinon, pourquoi tu rajoutes le (.+) ?
    Ici, ce qui nous intéresse, c'est de rajouter une chaine en position 12, c'est tout, on se fiche de la suite...
    Cordialement.

  6. #6
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    t'as complètement raison
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ time sed -r 's/^(.{12})/\1 001 TEST /' fichier > /dev/null
    real    0m14.094s
    reste que pour le coup c'est sans doute plus avisé d'y aller à coups de substr() que d'utiliser les regex

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Oui, mais là je suis un peu plus satisfait du résultat de sed

    Sinon, plus court en perl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -pe 'substr($_, 12,0, " 001 TEST ")' fichier
    Cordialement.

Discussions similaires

  1. effacer une chaine de caractère dans une ligne dans un fichier texte
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 25/08/2010, 10h22
  2. Réponses: 4
    Dernier message: 21/10/2009, 10h17
  3. Réponses: 4
    Dernier message: 10/07/2008, 13h34
  4. taille max de nb de caractère dans une ligne de table mysql
    Par zidenne dans le forum Administration
    Réponses: 1
    Dernier message: 01/09/2006, 11h04

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