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 :

Arguments par lecture de fichier


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Avril 2015
    Messages : 21
    Par défaut Arguments par lecture de fichier
    Bonjour
    je suis en shell linux. Ca fait des heures que je cherche sur les forums (comme ici : http://www.developpez.net/forums/d10...ourir-fichier/ ) et que je tente des trucs, mais rien n'y fait. Ca semble assez simple pourtant.

    Pour expliquer : mon répertoire contient 10 fichiers .txt qui doivent être passés à la moulinette d'un prog.awk. A cela il faut ajouter 2 arguments col1 et col2. Le problème est que les valeurs de col1 et col2 - dans le détail col1 est un string et col2 un nombre - doivent être récupérés d'un tierce fichier (param.dat) qui a 10 lignes par 3 colonnes (la 3e colonne est inusitée). Il faudrait donc pouvoir lire, à chaque boucle de for, la i-ième ligne du param.dat, et récupérer la colonne1 pour le premier argument d'awk, et la colonne2 pour le second. J'avais pensé à lire le param.dat avant la boucle for et le stocker en 3 arrays de colonnes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/sh
    while read -a col1 col2 col3; do ; done < param.dat
    for fichier in *.txt ; do
    	i=`expr $i + 1`
    	awk -v arg1=${col1[$i]} -v arg2=${col2[$i]} -f prog.awk $fichier
    done
    Je suis pas fort en shell. Une idée ? Merci d'avance

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Bonjour,

    t'es obligé de faire ça en shell POSIX (/bin/sh)? parce que POSIX n'implémente pas les tableaux.
    bon, en même temps, l'emploi d'un tableau ne semble pas pertinent ici.

    je résume :
    Code pseudo-code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    pour chaque_ficher d'un répertoire_donné
       autant de fois qu'il y a de lignes dans un fichier_data
          retenir les deux premiers champs
          traiter chaque_fichier avec awk et les deux premiers champs
       fin_autant
    fin_pour
    c'est ça ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    j'ajouterais à ce que dit N_BaH que awk -f prog.awk *.txt marche aussi, tu n'as peut-être pas besoin de boucle for au final

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Avril 2015
    Messages : 21
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    t'es obligé de faire ça en shell POSIX (/bin/sh)? parce que POSIX n'implémente pas les tableaux.
    bon, en même temps, l'emploi d'un tableau ne semble pas pertinent ici.

    je résume :
    Code pseudo-code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    pour chaque_ficher d'un répertoire_donné
       autant de fois qu'il y a de lignes dans un fichier_data
          retenir les deux premiers champs
          traiter chaque_fichier avec awk et les deux premiers champs
       fin_autant
    fin_pour
    c'est ça ?
    Hello,
    non, je peux mettre bash ou csh (je suis de la génération unix 90, et à l'époque je crois que c'était ksh ). Ton code est presque ça. Je reprends :
    Code pseudo-code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    pour chaque_ficher d'un répertoire_donné
       récupérer 1 seul ligne dans un fichier_data (la n-ème, dans l'ordre avec le n-ème chaque_fichier)
          retenir les deux premiers champs
          traiter chaque_fichier avec awk et les deux premiers champs
       fin_récupérer
    fin_pour

    évidemment, si on n'arrive pas à "isoler" la n-ème et qu'on doit, pour chaque itération for, relire tout le fichier_data et ne prendre que sa n-ième ligne pour les 2 premiers champs, c'est pas grave (le fichier est court)

  5. #5
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour,

    pour moi, tout peut être traité avec un seul petit script awk.
    Pour avancer, peux-tu donner un échantillon des fichiers de départ et le résultat que tu veux obtenir ?

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Avril 2015
    Messages : 21
    Par défaut
    en effet, j'avais tenté de tout faire sur awk; avec un getline appelant un 2e fichier, mais cette commande est trop bizarre (elle efface les champs $ du fichier principal, et ça saute d'une ligne, bref le foutoir ...). Mon programme est assez simple :

    prog.awk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    BEGIN {tablename="IW_FS"}
    {
    if (cnt==0) {cnt++; print arg1 > ARGV[1]".asc"; next} # ca ecrit dans un nouveau nom concaténé en appelant le nom du fichier
    if (cnt==1) {cnt++; print arg2 > ARGV[1]".asc"; next}
    if (cnt==2) {cnt++; print tablename > ARGV[1]".asc"; next}
    printf("%5d   %7.2f\n",$1,$2) > ARGV[1]".asc"    
    }

    param.dat
    SUG-0001 623 KB
    SUG-0004 614.2 KB
    SUG-0005 614 KB
    ... (10 lignes)


    fichier_01.txt (10 fichiers de ce genre, ordonnés en cohérence avec le param.dat)
    # ORIGIN=460
    # STEP=20
    # REGULAR COORDS
    460 52.219
    480 55.9167
    500 59.6082
    520 63.7675
    540 67.628
    560 71.5186
    580 75.5668
    ..... (plein de lignes)

    et le code serait pour le premier fichier isolé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -v arg1=SUG-0001 -v arg2=623 -f prog.awk fichier_01.txt
    pour le second :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -v arg1=SUG-0004 -v arg2=614.2 -f prog.awk fichier_02.txt
    etc ...

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    Bonjour,

    Flodelarab à raison, awk est suffisant pour faire le tout, voici des pistes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FNR == NR {A[FNR]=$1;B[FNR]=$2;next}
    ici on stock dans le tableau A le champs 1 et dans le tableau B le champs 2 tant que l'on lit le premier fichier (donc dans ton cas ce sera le param.dat)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FNR == 1 {X++}
    {arg1=A[X];arg2=B[X];....}
    FNR redémarre à chaque nouveau fichier, donc on incrémente l'index X (que l'on aura initialise à 0 dans BEGIN pour être propre) à chaque fois que FNR est égale à 1 (pour le premier fichier qui est le param.dat, il ne passera pas par cette étape grâce à la clause next.

Discussions similaires

  1. Lecture de fichier ligne par ligne
    Par chreks dans le forum Fortran
    Réponses: 4
    Dernier message: 19/05/2008, 18h09
  2. Lecture de fichier ligne par ligne avec caractères spéciaux
    Par Australia dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 28/11/2007, 15h30
  3. Lecture de fichiers wave par événements extérieurs
    Par Jean Breil dans le forum Pascal
    Réponses: 0
    Dernier message: 19/09/2007, 00h19
  4. Lecture de fichier par blocs
    Par nicolas66 dans le forum C++
    Réponses: 12
    Dernier message: 11/11/2006, 20h36
  5. Lecture de fichiers images pixels par pixels
    Par FabHacker dans le forum Langage
    Réponses: 3
    Dernier message: 26/11/2005, 16h12

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