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 :

Lire un fichier ligne par ligne avec Awk


Sujet :

Linux

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    124
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 124
    Par défaut Lire un fichier ligne par ligne avec Awk
    Bonjour
    Voilà, j'ai un fichier de la forme

    Nom tel_perso tel_pro sur chaque ligne
    ce qui donne, par exemple

    Nico:nomfamille 06451215 1654545
    Fabrice:nomfamille 4545564 5456456465
    Etienne:nomfamille 454564 5468789789
    Marcel:nomfamille 7897897987 987897897
    ..
    ..



    et j'aimerais pouvoir lire ligne par ligne chaque argument.
    en gros, faire un


    pour chaque ligne, do
    lire 1er argument
    lire 2eme argument
    lire 3eme argument
    traiter ( ici, c'est inclure dans un bdd sql )
    fin



    car j'ai déja testé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     awk '{print $1|cut-d" " -f1  $2 $3 }' /tmp/fichiertest
    pour avoir que le prenom et pas le nom.. et ça ne marche pas




    vous pensez que c'est faisable avec un awk ?

    Merci

  2. #2
    Membre Expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Par défaut
    awk traite des "enregistrements" (records) composés de "champs" (fields).

    Que ces enregistrements soient des lignes ou autre chose lui importe peu, pourvu qu'il connaisse le séparateur d'enregistrements (RS) et le séparateur de champs (FS).

    Son fonctionnement par défaut est de lire les enregistrements séparés par un saut de ligne. Il lit donc bien ligne par ligne et la boucle est implicite.

    Il effectue aussi automatiquement la séparation des champs, par défaut, sur des caractères blancs. Tes différents "arguments" sont donc bien récupérés dès la lecture de la ligne, dans des variables $1, $2, $3, ... selon leur position.

    Il est ainsi possible de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{ print "le tel de " $1 " est " $2;}' data.txt
    Et de remplacer le print par ton traitement ...


    Bon courage.

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    124
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 124
    Par défaut
    Merci de ta réponse
    mais on peut inclure du shell dedans ?

    car mon $1, en fait, ça serait un

  4. #4
    Membre Expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Par défaut
    Citation Envoyé par Krispy
    mais on peut inclure du shell dedans ?

    car mon $1, en fait, ça serait un
    Il est possible d'utiliser la fonction "system" de awk pour invoquer une commande externe éventuelle, mais s'il s'agit de réaliser une opération qui peut être faite nativement par awk, c'est du gachis !

    Dans ton cas, je ne perçois pas exactement le problème : s'agit-il d'un enregistrement de la forme dont tu voudrais récupérer le 'aa', le 'dd' et le 'ee' ?

    Si oui, tu as plusieurs solutions :
    • ajouter ':' au séparateur de champs (en précisant l'option " -f ':| ' " à l'invocation de awk. Ainsi, tu récupères les champs $1, $4 et $5 par exemple.
    • continuer à utiliser le blanc comme séparateur de champs, et ensuite, traiter le champ $1 pour l'éclater avec la fonction split (split ($1, eclate, ":");), et ensuite, récupérer la première valeur du champ éclaté (eclate[1]).
    • ... il y a d'autres possibilités ...


    Quoi qu'il en soit, ton $1 est le $1 issu de la séparation des champs par awk. A toi de faire macher le travail par awk, ou alors de spécifier les traitements qui vont bien pour avoir la valeur qui t'intéresse, dans $1 ou dans une autre variable.

    Bon courage.

  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
    Par défaut
    tu peux tout faire un awk

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $ awk '{split($1,n,":");print n[1],$2,$3}' x
    Nico 06451215 1654545
    Fabrice 4545564 5456456465
    Etienne 454564 5468789789
    Marcel 7897897987 987897897
    pour faire du shell, il y a bien getline, mais c'est pour les pros

  6. #6
    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
    Par défaut
    pour le fun

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $ awk '{"echo "$1"|cut -d: -f1"|getline x;print x,$2,$3}' x
    Nico 06451215 1654545
    Fabrice 4545564 5456456465
    Etienne 454564 5468789789
    Marcel 7897897987 987897897

  7. #7
    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
    Par défaut
    encore une pour le méga fun

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $ awk '{print $1}' RS=' ' FS=: ORS=' ' x
    Nico 06451215 1654545
    Fabrice 4545564 5456456465
    Etienne 454564 5468789789
    Marcel 7897897987 987897897

  8. #8
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    On dirait que certains s'ennuient un peu au boulot

  9. #9
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    124
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 124
    Par défaut
    Whaa génial !

    merci beaucoup !!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 03/07/2014, 18h08
  2. lire une base de donnee ligne par ligne
    Par thildouille dans le forum Langage
    Réponses: 9
    Dernier message: 03/06/2011, 00h50
  3. lire fichier .txt (NOTEPAD) ligne par ligne
    Par skambram dans le forum VB.NET
    Réponses: 1
    Dernier message: 06/06/2009, 18h41
  4. lire un fichier de string ligne par ligne
    Par bilzzbenzbilz dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 11/02/2009, 10h44
  5. Réponses: 3
    Dernier message: 16/10/2007, 20h45

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