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 :

Script AWK (débutant)


Sujet :

Linux

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 171
    Points : 80
    Points
    80
    Par défaut Script AWK (débutant)
    Bonjour,

    Je ne connais pas le language AWK, est ce que quelqu'un aurait la gentillesse de m'aider de transformer un fichier qui a cette tete:

    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
     
    *TableName			
    *DATE	*OIL	*GAS	*WATER
    //None	scft/day  stb/day   		
    *KeyName MZ_A-1			
    19981001	2272	713333	0
    19981101	2410	745660	1
    19981201	1992	646545	0
    19990101	1356	326599	0
    19990201	1123	135836	0
    19990301	984	248120	0
    19990401	1126	378400	3
    19990501	1011	332039	2
    19990601	732	264516	2
    19990701	652	227097	0
    19990801	721	214194	0
    19990901	1139	346429	1
    19991001	904	276589	0
    19991101	949	247333	0
    19991201	701	132203	1
    20000101	654	110000	1
    20000201	565	167667	2
    20000301	607	175517	1
    20000401	577	173701	0
    20000501	565	174000	0
    20000601	635	172549	2
    20000701	694	209150	1
    en


    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
     
     
    *TableName			
    *DATE	*OIL	*GAS	*WATER
    //None	scft/day  stb/day   		
    *KeyName MZ_A-1			
    19981031	2272	713333	0
    19981130	2410	745660	1
    19981231	1992	646545	0
    19990131	1356	326599	0
    19990228	1123	135836	0
    19990331	984	248120	0
    19990430	1126	378400	3
    19990531	1011	332039	2
    19990630	732	264516	2
    19990731	652	227097	0
    19990831	721	214194	0
    19990930	1139	346429	1
    19991031	904	276589	0
    19991130	949	247333	0
    19991231	701	132203	1
    20000131	654	110000	1
    20000228	565	167667	2
    20000331	607	175517	1
    20000430	577	173701	0
    20000531	565	174000	0
    20000630	635	172549	2
    20000731	694	209150	1

    en gros je n'ai fait que transformer le debut du mois en fin de mois (premiere colonne): YYYYMMDD (year/Month/Day)

    Merci d'avance pour votre aide
    -----------------------
    Cordialement
    Developpeur82

  2. #2
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Juste une question :
    Quelle version de date ? Y a-t-il l'option '-d' ?
    Si c'est le cas alors voici 2 fonctions bash qui permmettent de trouver respectivement le 1er et le dernier jour du mois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MonthFirst() { date -d "$1" +%Y%m01; }
    MonthLast() { date -d "$(MonthFirst "$1") + 1 month - 1 day" +%Y%m%d; }
    à essayer par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MonthFirst "today"
    MonthLast "today"
    Si cela fonctionne on peut assez facilement utiliser bash pour modifier le fichier.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 171
    Points : 80
    Points
    80
    Par défaut
    Bonjour,

    merci pour la reponse. j'ai créé un fichier script.awk dans lequel j'ai mis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BEGIN {}
    MonthFirst() { date -d "$1" +%Y%m01; } 
    MonthLast() { date -d "$(MonthFirst "$1") + 1 month - 1 day" +%Y%m%d; }
    et dans une fenetre de commande Linux je l'ai appelé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    awk -f script.awk fichier_depart.txt > fichier_converti.txt
    mais j'ai des syntaxe error...

    en fait je ne cherche pas aller tres loin:
    je veux juste que le debut de mois devient fin du mois.

    ex: 19981001 devient 19981030

    en voici les fin de chq mois
    01 (janv) -> 31
    02 (fev) -> 28
    03 (mars) -> 31
    04 (avril) -> 30
    05 (mai) -> 31
    06 (juin) -> 30
    07 (juillet) -> 31
    08 (aout) -> 31
    09 (sept) -> 30
    10 (oct) -> 31
    11 (nov) -> 30
    12 (dec) -> 31

    voila donc je souhaite garder le fichier tel qu'il est et transformé le debut de mois en fin de mois selon le mois en question...

    Merci encore pr votre aide
    -----------------------
    Cordialement
    Developpeur82

  4. #4
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Voici une solutien en bash
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    while read L DUMP
    do
    	# Pour ne traiter que les lignes contenant la date en premier champ
    	DAT=$(date -d $L +%Y%m%d 2>/dev/null) || { echo "$L $DUMP"; continue; }
    	echo "$(date -d "$DAT + 1 month - 1 day" +%Y%m%d) $DUMP"
    done < infile # > outfile # à décommenter pour rediriger la sortie vers u nfichier

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 171
    Points : 80
    Points
    80
    Par défaut
    merci!

    disons que j'ai essayé d'executer ce script par la ligne de commande suivante dans Linux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    source script.sh ProductionData.prd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #!/bin/bash
    while {read L DUMP}
    {
    	# Pour ne traiter que les lignes contenant la date en premier champ
    	DAT=$(date -d $L +%Y%m%d 2>/dev/null) || { echo "$L $DUMP"; continue; }
    	echo "$(date -d "$DAT + 1 month - 1 day" +%Y%m%d) $DUMP"
    } < ProductionData.prd > outfile ProductionDataOut.prd
    mais ca ne marche pas j'ai l'erreur: Missing }.

    Merci encore...
    -----------------------
    Cordialement
    Developpeur82

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    mais pourquoi ajouter des accolades ?
    Il n'y a qu'à recopier le script de fransoo !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
     
    infile=$1
    while read L DUMP
    do [[ $L =~ [0-9]{8} ]] && L=$(date -d "$L + 1 month - 1 day" +%Y%m%d 2>/dev/null)
       echo "$L $DUMP"
    done < $infile # >outfile
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 171
    Points : 80
    Points
    80
    Par défaut
    j'ai pris le script tel qu'il est. je l'ai coller dans un fichier que j'ai appelé "script.sh". j'ai mis ce script dans un repertoire "x". Dans "x" j'ai mis aussi le fichier origine que je veux modifier. en ligne de commande linux, j'ai lancé avec la ligne de commande suivante sur Linux:
    j'ai le message d'erreur suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while: Expression Syntax
    désolé si j'ai commis une erreur triviale dans le lancement de script..

    J'ai mis le script "script.sh" en pièce jointe ainsi que le fichier départ à convertir.

    Merci encore...
    Fichiers attachés Fichiers attachés
    -----------------------
    Cordialement
    Developpeur82

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Tu multiplies les obstacles !

    - tu écris tes scripts avec des outils Windows
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    cat -v script.sh 
    #!/bin/bash^M
    while read L DUMP^M
    do [[ $L =~ [0-9]{8} ]] && L=$(date -d "$L + 1 month - 1 day" +%Y%m%d 2>/dev/null^M
    echo "$L $DUMP" ^M
    done < infile # > outfile^M
    pour être utilisé sur GNU/Linux il faudra les passer par fromdos ou dos2unix

    - tu compresses, donc, tes fichiers avec des outils non-libres : rar est un format propriétaire

    - tu ne recopies pas fidèlement les scripts qu'on te fournit :
    regarde la différence entre ce que j'ai copié avec cat (tout chaud extrait de fichiers.rar), et ce que j'ai écrit précédemment
    ...

    Bref.

    Pour lancer un script sur GNU/Linux, il faut le rendre exécutable :
    chmod u+x script
    puis, on le lance ainsi :
    ./script
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. aide script awk
    Par s@mson dans le forum Linux
    Réponses: 3
    Dernier message: 24/11/2007, 22h20
  2. Script AWK pour fichiers xyz
    Par Frankii dans le forum Linux
    Réponses: 4
    Dernier message: 26/07/2007, 21h57
  3. Besoin de script cause débutant
    Par frederichuet dans le forum Administration
    Réponses: 6
    Dernier message: 18/07/2007, 14h11
  4. Script awk ou ksh pour découper un fichier xml
    Par Griffith dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 15/05/2007, 22h58

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