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 :

Script avec sed et awk


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Par défaut Script avec sed et awk
    Bonjour tlm,

    quelqu'un peut m'aider pour ecrire un script avec awk et sed ?

    Voila, j'ai un fichier que je veux modifier quelques lignes et le resultat sera
    diriger vers un nouveau fichier.

    En fait les lignes que je veux modifier commence toute avec la meme chaine de caractères, mais chaque lignes est diviser en plusieurs champs, et moi je veux modifier le 3ème champ de cette ligne

    Merci.

  2. #2
    Membre expérimenté
    Inscrit en
    Octobre 2005
    Messages
    344
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 344
    Par défaut
    Je ne l'ai pas testé, mais ça devrait marcher ....

    while read ligne
    do
    champs1=`echo $ligne | awk '{print $1}'`
    # on teste si la ligne commence par le mot voulu
    if [ "$champs1" = "<chaine de caractere voulue>" ]
    then
    champs3=`echo $ligne | awk '{print $3}'`
    # on remplace le troisieme mot par ce que l on veut
    ligne=`echo $ligne | sed s/"$champs3"/"new_champs3"`
    fi
    echo $ligne >> nouveau_fichier
    done < old_fichier

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Par défaut Script shell avec awk et sed
    Bonjour,

    Merci pour la portion du script. Seulement ou dois je spécifier le nom de fichier à traiter, vu que j'en ai plusieurs dans le repertoire.

    Merci pour ta précieuse aide.

  4. #4
    Membre expérimenté
    Inscrit en
    Octobre 2005
    Messages
    344
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 344
    Par défaut
    il y a deux façons de faire : soit :
    for old_fichier in fichier1 fichier2 ... fichiern
    do
    ...
    done
    ou alors :
    for old_fichier in `ls -1 fichier*`
    ...
    done
    et remplacer old_fichier dans mon script précédent par $old_fichier

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Par défaut
    Bonjour,

    Voila je résume :

    for file in `ls -1 *.txt`
    do
    while read ligne
    do
    champs1=`echo $ligne | awk '{print $1}'`
    # on teste si la ligne commence par le mot voulu
    if [ "$champs1" = "debut de la chaine" ]
    then
    champs3=`echo $ligne | awk '{print $3}'`
    # on remplace le troisieme mot par ce que l on veut
    ligne=`echo $ligne | sed s/"$champs3"/"**********"`
    fi
    echo $ligne >> image_fichier_test.txt
    done
    done

    Mais j'ai lancer le script et il ya rien .

    Merci

  6. #6
    Membre expérimenté
    Inscrit en
    Octobre 2005
    Messages
    344
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 344
    Par défaut
    tu as oublié dans le premier done:
    done < $file

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Par défaut script shell avec sed et awk
    Bonjour,

    Je crois qu'il manque quelque chose dans la partie de substitution de sed, car j'ai le message suivant :

    mon_script.sh[11]: [debut de la chaine: not found.

    Merci.

  8. #8
    Membre expérimenté
    Inscrit en
    Octobre 2005
    Messages
    344
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 344
    Par défaut
    il manque le "/" à la fin :

    ligne=`echo $ligne | sed s/"$champs3"/"**********"/`

  9. #9
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Par défaut script avec sed et awk
    Bonjour,

    Ca marche tjs pas. De plus le fichier généré a perdu le formatage comme le fichier initial.

    Merci

  10. #10
    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
    Par défaut
    Ce ne serait pas plus simple comme ceci ? :

    awk -F"SEPARATEUR" '{ gsub("REGEXP","MODIFICATIONCHAINE",$3) ; print $0 }' > fichier

  11. #11
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Par défaut script avec sed et awk
    Bjr,

    Peux tu m'expliquer cette instruction ? plz

  12. #12
    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
    Par défaut
    awk -F"SEPARATEUR" '{ gsub("REGEXP","MODIFICATIONCHAINE",$3) ; print $0 }' > fichier

    Pour un SEPARATEUR : SEPARATEUR
    Modifie le champ 3 $3 en remplacant l'expression reguliere REGEXP par la chaine MODIFICATIONCHAINE

    Une fois que c'est fait, tu affiches la ligne au complet

  13. #13
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Par défaut script avec sed et awk
    Dans ce cas, le SEPARATEUR serait $CHAMPS1, REGEXP serait $CHAMPS3, et MODIFICATIONCHAINE serait ma nouvelle chaine de caractères, n'est pas ?

    Merci

  14. #14
    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
    Par défaut
    je vais prendre un exemple concret :

    soit un fichier fichier.txt qui contient

    coucou|lala|truc|mucherg
    coucou|lala|truc|muchegr
    coucou|lala|truc|muchefvr
    coucou|lala|truc|muchef
    coucou|lala|truc|muchefje


    j'ameliore au passage mon fichier.awk

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    BEGIN {
     
            FS="|" 
            OFS="|"
    }
    {
            sub("uc","Oulala",$3) ; print $0
     
    }
    FS etant le séparateur de champ en entrée
    OFS etant le séparateur de champ en sortie

    dans le champ 3 je remplace "uc" par "oulala" ( exemple stupide inside )

    awk -f fichier.awk fichier.txt > nouveau_fichier.txt

    Resultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    coucou|lala|trOulala|mucherg
    coucou|lala|trOulala|muchegr
    coucou|lala|trOulala|muchefvr
    coucou|lala|trOulala|muchef
    coucou|lala|trOulala|muchefje

  15. #15
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Par défaut script avec
    Re-bjr,

    je crois que c'est mieux que ce que j'avais auparavant, seulement la chaine que je veux modifier n'est pas identique dans toute les lignes, elle varie.

    Ya t-il un moyen de contourner le fichier .awk ?


    Merci bcp pour ta précieuse aide.

  16. #16
    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
    Par défaut
    Si tu donnais un exemple avec fichier d'entrée et de sortie avec quelques explications, ce serait bienvenu

Discussions similaires

  1. Problème script avec sed
    Par irons dans le forum Linux
    Réponses: 3
    Dernier message: 25/01/2011, 11h33
  2. Script bash - besoin d'aide avec sed & awk
    Par Obiwan31 dans le forum Unix
    Réponses: 1
    Dernier message: 23/04/2010, 10h11
  3. [Shell] problème avec sed et awk
    Par tizilfin dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 15/11/2007, 13h01
  4. Extraction avec sed ou awk
    Par dubis dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 09/10/2007, 09h44
  5. script shell : probleme avec sed et awk
    Par salseropom dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 05/06/2007, 11h57

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