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

Linux Discussion :

Awk - Nawk


Sujet :

Linux

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Awk - Nawk
    Bonjour à tous,

    Voilà, j'ai un petit souci avec un script et je n'arrive pas à le résoudre.
    J'ai un fichier : fichier1 qui a cette structure là :

    ligne1col1 ligne1col2 ligne1col3
    ligne2col1 ligne2col2 ligne2col3
    ligne3col1 ligne3col2 ligne3col3

    Je voudrais traiter les lignes une par une et stocker dans des variables les valeurs.

    Pour la ligne 1 : $n1=ligne1col1 $n2=ligne1col2 $n3=ligne1col3 et ainsi de suite.

    J'ai donc tenté le code ci dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #!/bin/csh
     
    cd /usr/interfaces/entrante
     
    foreach line (`cat fichier1`)
     
                 set n1 = `cat fichier1 | nawk '{FS=" "; OFS=" "; print $1 }'`
                 set n2 = `cat fichier1 | nawk '{FS=" "; OFS=" "; print $2 }'`
                 set n3 = `cat fichier1 | nawk '{FS=" "; OFS=" "; print $3 }'`
     
    echo $n1 $n2 $n3
     
    end
    Mais ce n'est pas ça...
    Si quelqu'un voit comment je pourrais faire, cela m'aiderai.

    Par avance merci.

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonjour à tous,

    Je me permets de faire une petite relance sur ce sujet.
    La boucle serait-elle mal définie?

    Merci de votre aide.

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut [csh]
    as-tu une raison particulière d'employer le csh???

    en bash, je ferais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #!/bin/sh
    cd /usr/interfaces/entrante
    while read n1 n2 n3 restedelaligne
    do
      echo $n1 $n2 $n3
    done < fichier1

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci de votre aide.

    L'utilisation du csh est justifiée par le fait que je reprends un script de plusieurs centaines de lignes et que ce script est écrit en csh......

    Donc je dois rester dans cette logique.

  5. #5
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    csh était à la mode dans les années 80, il y a des scripts comme bash qui sont beaucoup plus puissants.

    écrire un script un csh, c'est faire des workaround et s'arracher les cheveux ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    % cat fichier1
    1 2 3
    4 5 6
     
    % foreach line (`sed "s/ /-/g" fichier1`)
    ? set n1 = (`echo $line | cut -d- -f1`)
    ? set n2 = (`echo $line | cut -d- -f2`)
    ? set n3 = (`echo $line | cut -d- -f3`)
    ? echo $n1 $n2 $n3
    ? end
    1 2 3
    4 5 6

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Je suis entièrement d'accord...mais bon je n'ai pas trop le choix.
    Merci pour le code.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Re,

    Je reviens avec mon problème.

    laurentschneider j'ai adapté mon script avec ta solution ce qui me donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #!/bin/csh
     
    foreach line (`sed "s/ /-/g" fichier1`)
     
            set n1 = (`echo $line | cut -d- -f1`)
            set n2 = (`echo $line | cut -d- -f2`)
            set n3 = (`echo $line | cut -d- -f3`)
     
            echo  $n1 $n2 $n3        
     
     
    end
    Je l'ai testé avec mon fichier de départ (début du topic) et j'obtiens ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ligne1col1 ligne1col1 ligne1col1
    ligne1col2 ligne1col2 ligne1col2
    ligne1col3 ligne1col3 ligne1col3
    ligne2col1 ligne2col1 ligne2col1
    ligne2col2 ligne2col2 ligne2col2
    ligne2col3 ligne2col3 ligne2col3
    n1, n2, n3 ont à chaque passage la même valeur.

    Ai-je mal utilisé ta source?

    Merci beaucoup.

  8. #8
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    ici ça marche

    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
    24
    25
    26
     
    % cat fichier1
    ligne1col1 ligne1col2 ligne1col3
    ligne2col1 ligne2col2 ligne2col3
    ligne3col1 ligne3col2 ligne3col3
    %  od -a fichier1 
    0000000    l   i   g   n   e   1   c   o   l   1  sp   l   i   g   n   e
    0000020    1   c   o   l   2  sp   l   i   g   n   e   1   c   o   l   3
    0000040   lf   l   i   g   n   e   2   c   o   l   1  sp   l   i   g   n
    0000060    e   2   c   o   l   2  sp   l   i   g   n   e   2   c   o   l
    0000100    3  lf   l   i   g   n   e   3   c   o   l   1  sp   l   i   g
    0000120    n   e   3   c   o   l   2  sp   l   i   g   n   e   3   c   o
    0000140    l   3  lf  lf
    0000144
    % foreach line (`sed "s/ /-/g" fichier1`)
    ?         set n1 = (`echo $line | cut -d- -f1`)
    ?         set n2 = (`echo $line | cut -d- -f2`)
    ?         set n3 = (`echo $line | cut -d- -f3`)
    ? 
    ?         echo  $n1 $n2 $n3        
    ? 
    ?         
    ? end 
    ligne1col1 ligne1col2 ligne1col3
    ligne2col1 ligne2col2 ligne2col3
    ligne3col1 ligne3col2 ligne3col3

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    A quoi sert "od" ?
    Le problème venait du fait que j'avais une tabulation à la place d'espaces.
    Donc si j'ai un fichier qui contient plusieurs espaces entre les données ça ne fonctionne pas? c'est dommage ça.

    J'ai également comme soucis le fait que la boucle n'affiche jamais ma dernière ligne....

    Bref, chez moi c pas top.....

  10. #10
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par SAP-Ghis
    A quoi sert "od" ?
    Le problème venait du fait que j'avais une tabulation à la place d'espaces.
    Donc si j'ai un fichier qui contient plusieurs espaces entre les données ça ne fonctionne pas? c'est dommage ça.

    J'ai également comme soucis le fait que la boucle n'affiche jamais ma dernière ligne....

    Bref, chez moi c pas top.....
    od, c'était pour voir si tu n'avais pas des tabulations à la place des espaces...

    tu peux changer le sed.

    note, tu peux faire tout en awk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    % awk '{print $1,$2,$3}' fichier1              
    ligne1col1 ligne1col2 ligne1col3
    ligne2col1 ligne2col2 ligne2col3
    ligne3col1 ligne3col2 ligne3col3

  11. #11
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 1
    Points : 2
    Points
    2
    Par défaut une reponse quelques annéesplus tard !
    cat fichier1 | awk '{ print $1 " " $2 " " $3 }'

Discussions similaires

  1. awk/nawk : utiliser RS avec plusieurs caractères
    Par gangsoleil dans le forum Solaris
    Réponses: 4
    Dernier message: 22/01/2015, 15h06
  2. Awk
    Par iamspacy dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 08/08/2007, 16h18
  3. Awk - Traiter chaque ligne du fichier passwd
    Par tony montana dans le forum Linux
    Réponses: 7
    Dernier message: 25/03/2004, 09h40
  4. Tableau en paramètre - Shell et Awk
    Par gc243 dans le forum Linux
    Réponses: 7
    Dernier message: 10/12/2003, 13h32
  5. [langage] awk et sed dans script perl
    Par scoti dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2003, 18h26

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