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 :

Extraction de données avec awk [Débutant(e)]


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
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Par défaut Extraction de données avec awk
    Bonjour à tous,

    Je suis complètement novice dans les commandes shell, mais je me dis que ce serait plus rapide de scripter mon problème en shell qu'en python...

    voilà : j'ai un fichier txt avec un "header" de 23 lignes puis une phrase "Result i,30" et ensuite des chiffres arrangé de maniere particuliere du type :

    Result i, 30
    82 82 82 0
    0.3871 0.000 0.000 0.000 0.000
    -0.971559798 0.196499691 -0.132134137
    -0.173016175 -0.970059688 -0.170439444
    -0.161669298 -0.142730769 0.976468620
    [...]
    Ce que j'aimerais faire c'est récupérer la valeur de i et ensuite récuperer la derniere colonne de chiffre (-0.132134137,-0.170439444,0.976468620), et ecrire tous ca dans un fichier result.txt.

    Evidement cette séquence "Result i", se reproduit n fois dans mon fichier texte.
    Voilà, j'espere que le probleme est pas trop mal pose.

    Je me suis dit que je pouvais essayer d'utiliser grep ou awk pour extraire les information dans un autre fichier texte.

    Mais la question est comment ecrire ce awk ?

    En gros il faut qu'il trouve la ligne qui aura "Grain" && "," dans la meme ligne puisqu'il saute 2 lignes et qu'il recuperer la 3eme colonne des 3 lignes suivantes.

    Si j'ecris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{ print $3}' fichier.txt > recup.txt
    Il me recupere bien les 3eme colonne mais evidement sans distinction entre les lignes...

    Une idée ? une proposition ?

    Merci pour votre aide !

  2. #2
    Membre très actif
    Inscrit en
    Février 2009
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 205
    Par défaut
    Bonjour,

    juste une question, le i correspond à quoi, donne un exemple ?


    Sinon, en attendant ta réponse, pour récupérer la dernière colonne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    egrep -i "[.0-9-]{3,}$"  ./fichier.txt
    A+

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Par défaut
    Merci beaucoup pour l'aide !

    Si je comprends bien la structure de egrep:
    [.0-9-]: type de structure de la ligne conserné
    {3,}$: imprime la troisieme colonne
    ./fichier.txt : applique sur le fichier.txt
    A quoi sert l'option -i ?

    Est-ce que c'est plus efficace que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    awk '{ print $3}' fichier.txt | head -739 > result.txt
    Pour répondre à la question, i s'ingremente pour chaque série de résultat. Mon fichier est structuré comme ca:
    Header (23 lignes de texte)
    Result 1, 30
    82 82 82 0
    0.3871 0.000 0.000 0.000 0.000
    -0.971559798 0.196499691 -0.132134137
    -0.173016175 -0.970059688 -0.170439444
    -0.161669298 -0.142730769 0.976468620
    [...suite de chiffre...]
    Result 2, 30
    82 82 82 0
    0.3871 0.000 0.000 0.000 0.000
    -0.971559798 0.196499691 -0.132134137
    -0.173016175 -0.970059688 -0.170439444
    -0.161669298 -0.142730769 0.976468620
    [...suite de chiffre...]
    etc

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Une solution avec "sed" :

    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
    $ cat brol
    Header (23 lignes de texte)
    Result 1, 30
    82 82 82 0
    0.3871 0.000 0.000 0.000 0.000
    -0.971559798 0.196499691 -0.132134137
    -0.173016175 -0.970059688 -0.170439444
    -0.161669298 -0.142730769 0.976468620
    [...suite de chiffre...]
    Result 2, 30
    82 82 82 0
    0.3871 0.000 0.000 0.000 0.000
    -0.971559798 0.196499691 -0.132134137
    -0.173016175 -0.970059688 -0.170439444
    -0.161669298 -0.142730769 0.976468620
    [...suite de chiffre...]
    etc 
     
    $ sed -n '/^Result [0-9]\+/{n;n;n;N;N;s/^.* \(.*\)\(\n\|$\)/\1,/Mgp;}' brol 
    -0.132134137,-0.170439444,0.976468620,
    -0.132134137,-0.170439444,0.976468620,
     
    $

  5. #5
    Membre très actif
    Inscrit en
    Février 2009
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 205
    Par défaut
    +1 pour zip31 qui a la solution, il est trop fort.

    Sinon, le -i pour egrep, tu peux l'enlever. le -i veut dire insensible à la casse. Mais comme tu ne manipule que des chiffres t'as pas besoin du -i du egrep.

  6. #6
    Membre très actif
    Inscrit en
    Février 2009
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 205
    Par défaut
    Sinon il y a plus court :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    egrep -o  "Result [0-9]+|[.0-9-]{3,}$"  ./fichier.txt
    Si tu veux mettre le rapport dans un fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    egrep -o  "Result [0-9]+|[.0-9-]{3,}$"  ./fichier.txt > result.txt

Discussions similaires

  1. [Tableaux] Extraction de données avec cURL
    Par mrsoyer dans le forum Langage
    Réponses: 7
    Dernier message: 09/07/2009, 14h16
  2. [XSLT] extraction de donnéés avec xsl
    Par bobkorn dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 21/04/2008, 11h25
  3. Réponses: 4
    Dernier message: 07/11/2007, 15h44
  4. MSSQL : extraction de données avec bcp
    Par khaledus dans le forum Outils
    Réponses: 1
    Dernier message: 24/08/2007, 14h58
  5. MSSQL : extraction de données avec bcp
    Par khaledus dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 24/08/2007, 14h58

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