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 :

Compiler des valeurs provenant de plusieurs fichiers


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 34
    Par défaut Compiler des valeurs provenant de plusieurs fichiers
    Bonjour,

    Je suis débutant complet en shell. Mes repères en programmation sont vba et php... Bref vous voyez le contexte
    J'ai passé pas mal de temps à lire les tutos awk et shell trouvé ici, et à taper sur Google, sans réussir à déméler mon truc... Ca m'a l'air pourtant simplisime, en vba ça m'aurait pris 10mn ! Mais j'ai besoin de faire cette routine en shell.

    J'ai plusieurs fichiers contenants des valeurs qui m'intéressent et que je voudrais ordonner dans un nouveau fichier.
    Voici un listing exemple de mes fichiers :
    10.dossier -> fichier texte contenant plusieurs valeurs relatives à l'id 10 (on pourrait nommer ces valeurs sf10, sp10)
    11.dossier -> fichier texte contenant plusieurs valeurs relatives à l'id 11 (on pourrait nommer ces valeurs sf11, sp11)
    12.dossier -> fichier texte contenant plusieurs valeurs relatives à l'id 12 (on pourrait nommer ces valeurs sf12, sp12)
    SrefSummary.txt -> fichier texte formaté ainsi : une ligne par id, en csv, contenant comme premier champ de chaque ligne l'id :
    10,bla10,ble10
    11,bla11,ble11
    12,bla12,ble12

    Je voudrais créer un nouveau fichier texte qui stoquera les infos ainsi :
    sf10,sp10,10,bla10,ble10
    sf11,sp11,11,bla11,ble11
    sf12,sp12,12,bla12,ble12
    C'est à dire 2 infos par id lues dans id.dossier, puis l'unique ligne de SrefSummary.txt commençant par id.
    Puis retour chariot.
    Puis même chose pour id suivant.

    J'ai également récupéré un bout de code qui fait une partie du boulôt et que je cherche à modifier selon mes besoins. Celui ci combine shell et awk. Je ne suis pas capable de juger sa qualité...
    Il crée un fichier temporaire en awk capable d'aller chercher sf10 et sp10 et d'autres valeurs dans 10.dossier

    Ici la partie que j'ai essayé de modifier à mon niveau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for fic in `ls *.dossier */*.dossier 2> /dev/null`
    do 
      no=$(echo $fic | tr "." "\n")
      awk -f /tmp/file_awk_mission_$$ $fic
      awk '/10/ {print $0}' SrefMemory.txt
      awk '/"$no[1]"/ {print $0}' SrefMemory.txt
      printf "\n"
    done
    * Mon premier problème est que la ligne 5 fonctionne, mais pas la ligne 6 : quand j'essaie d'utiliser une variable pour attraper la ligne "id" de SrefSummary.txt ça ne sort rien. Pourtant un echo de $no[1] donne bien le numéro d'id attendu.

    * Mon deuxième problème concerne la mise en forme des valeurs sf10, sp10. Le fichier awk temporaire qui va lire dans les id.dossier est pour l'instant écrit ainsi (il va chercher plein de valeurs, moi seulement 2 m'intéressent, a[4] et a[8]) :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    BEGIN{
       FS=":"
       j=0
       i=0
    }
    {
       if ( i >= 1 )
       {
          i++
       }
       if ( $2 == "Most severe flight" )
       {
          i=1
       }
       if ( i == 4 )
       {
          split($0,a)
       }
       if ( j >= 1 )
       {
          j++
       }
       if ( $2 == " Nb flight tot " )
       {
          j=1
       }
       if ( j == 3 )
       {
          split($0,b)
       }
    }
    END{
       if ( b[3] != "" )
       {
         FS="."
         split(FILENAME,c)
         printf ("%s%s%s%s%s%s%s%s%24s",b[3],b[4],b[8],a[3],a[4],a[7],a[6],a[8],a[9])
       }
    }
    Et là je n'arrive pas à utiliser correctement la commande printf de la ligne 37 pour formater l'impression de a[4] et a[8] seulement au lieu de toutes les valeurs actuellement imprimées : je voudrais supprimer les espaces que contiennent ces 2 strings a[4] et a[8], et les imprimer l'un après l'autre séparés par une virgule.

    J'ai l'impression que c'est rien à faire ! Merci si vous m'avez lu jusque là...

    Stéphane.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 34
    Par défaut
    Bon,

    J'ai résolu ainsi :

    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
    27
    28
    29
    30
    #!/bin/ksh
    #
     
    #[...]
     
    cat >/tmp/file_awk_ref<<'EOF'
    BEGIN{
       FS=","
    }
    {
      if ($1 == id)
      {
        a=$0
      }
    }
    END{
        printf a
    }
    EOF
     
    for fic in `ls *.dossier */*.dossier 2> /dev/null`
    do 
      awk -f /tmp/file_awk_mission_$$ $fic
      id=$(echo $fic | tr -d ".dossier")
      awk -v id=$id -f /tmp/file_awk_ref SrefMemory.txt
      printf "\n"
    done
    rm -f /tmp/file_awk_mission_$$
    rm -f /tmp/file_awk_ref
    exit
    Aucune idée de si c'est du travail propre, ça me sort ce dont j'avais besoin.
    Suis preneur de remarques...

  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,

    je me base sur ton dernier post, au minimum je remplace ta boucle for par quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    find . -maxdepth 2 -name "*.dossier" 2>/dev/null | while read fic
    do
       awk -v id="${fic%.dossier}" -F',' '$1 == id {a = $0} END {print a}' SrefMemory.txt
    done

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

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

    je voudrais supprimer les espaces que contiennent ces 2 strings a[4] et a[8], et les imprimer l'un après l'autre séparés par une virgule.
    La fonction trim de awk enlève les espaces.
    Si tu les veux côte à côte, écris-les côte à côte ...

    Je ne suis pas capable de juger sa qualité...
    Et bien c'est nul. En même temps, on ne comprend pas l'énoncé mal-exposé. Donc la résolution est à l'avenant.

    As-tu un échantillon des fichiers d'entrée et la sortie attendue ?

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/03/2007, 09h52
  2. Réponses: 2
    Dernier message: 21/02/2007, 11h22
  3. Réponses: 2
    Dernier message: 26/01/2007, 14h58
  4. [MySQL] Inserer des donnée provenant d'un fichier
    Par agencep dans le forum PHP & Base de données
    Réponses: 48
    Dernier message: 20/02/2006, 17h30
  5. [Conception] inserer des valeurs provenant d'une liste multiple
    Par digger dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 24/11/2005, 17h35

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