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 :

[awk] Suppression de la dernière ligne d'un fichier


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut [awk] Suppression de la dernière ligne d'un fichier
    Bonjour,

    Mon but est de supprimer la dernière ligne de mon fichier via un script AWK

    Fichier initial qui comprend une ligne blanche à la fin: fichier.csv

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ cat fichier.csv
    "DUPONT","HENRI","PARIS","FR","12-08-1950","123456789","FR12345","GU","120","EUR","CARTE","11"
    "DUPONT","HENRI","PARIS","FR","12-08-1950","123456789","FR12345","GU","120","EUR","CARTE","11"
    "MARTIN","LUCIEN","PARIS","FR","20-02-2000","412566655","FR43333","GA","420","EUR","CHEQUE","1"
    "LECOMTE","CATHERINE","PARIS","FR","21-08-1989","842216654","FR8523","GC","25000","EUR","CARTE","15"
    "MARTIN","JACQUES","PARIS","FR","21-08-1902","9876543210","FR456788","GA","3600","EUR","CHEQUE","58"
    "MARTIN","JACQUES","PARIS","FR","21-08-1902","9876543210","FR456788","GC","25000","EUR","CARTE","120"
     
    $


    Mon but est d'avoir le fichier suivant (fichier résultat.csv)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1;1;MARTIN;LUCIEN;PARIS;20/FEB/2000;412566655;FR43333;GA;420;EUR;CH;
    2;178;MARTIN;JACQUES;PARIS;21/AUG/1902;9876543210;FR456788;GA;3600;EUR;CH;GC;25000;EUR;CB;
    1;15;LECOMTE;CATHERINE;PARIS;21/AUG/1989;842216654;FR8523;GC;25000;EUR;CB;
    2;22;DUPONT;HENRI;PARIS;12/AUG/1950;123456789;FR12345;GU;120;EUR;CB;GU;120;EUR;CB;

    Pour supprimer une ligne blanche, on peut utiliser awk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    awk 'NF > 0' filename
    awk NF file
    awk '!/^$/' file

    Je ne parviens pas à l'intégrer dans mon script awk
    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
    #!/usr/bin/awk -f
     
    BEGIN {
       FS="\",\""
       b=";"
    }
    {  
       gsub(/"/,"",$1)
       gsub(/-01-/,"/JAN/",$5)
       gsub(/-02-/,"/FEB/",$5)
       gsub(/-03-/,"/MAR/",$5)
       gsub(/-04-/,"/APR/",$5)
       gsub(/-05-/,"/MAY/",$5)
       gsub(/-06-/,"/JUN/",$5)
       gsub(/-07-/,"/JUL/",$5)
       gsub(/-08-/,"/AUG/",$5)
       gsub(/-09-/,"/SEP/",$5)
       gsub(/-10-/,"/OCT/",$5)
       gsub(/-11-/,"/NOV/",$5)
       gsub(/-12-/,"/DEC/",$5)
       $11=$11=="CARTE"?"CB":"CH"
       a=$1b$2b$3b$5b$6b$7
       ++c[a]
       e[a]=e[a]$8b$9b$10b$11b
       g[a]=g[a]+$12  
    }
    END {
       for(i in c)print c[i]b g[i]b i b e[i]
    }

    J'ai donc cela en résultat final
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1;0; ;;;;;;;;;CH;
    1;1;MARTIN;LUCIEN;PARIS;20/FEB/2000;412566655;FR43333;GA;420;EUR;CH;
    2;178;MARTIN;JACQUES;PARIS;21/AUG/1902;9876543210;FR456788;GA;3600;EUR;CH;GC;25000;EUR;CB;
    1;15;LECOMTE;CATHERINE;PARIS;21/AUG/1989;842216654;FR8523;GC;25000;EUR;CB;
    2;22;DUPONT;HENRI;PARIS;12/AUG/1950;123456789;FR12345;GU;120;EUR;CB;GU;120;EUR;CB;

    Quelqu'un aurait-il aussi une meilleure idée pour le changement de date?

    Merci d'avance

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    (...)
    BEGIN{
    (...)
    }
     
    !NF{next;}
     
    {
    (...)
    Pour la date, tu peux aussi faire un tableau. Voire un fichier annexe.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    Bonjour,

    Citation Envoyé par man awk
    An awk program is a sequence of patterns and corresponding actions.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    J'ai toujours la ligne "parasite" dans le fichier résultat.csv
    1;0; ;;;;;;;;;CH;

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    quelles modifications as-tu effectuées sur ton script ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    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
    #!/usr/bin/awk -f
     
    BEGIN {
       FS="\",\""
       b=";"
    }
    !NF{next;}
    {  
       gsub(/"/,"",$1)
       gsub(/-01-/,"/JAN/",$5)
       gsub(/-02-/,"/FEB/",$5)
       gsub(/-03-/,"/MAR/",$5)
       gsub(/-04-/,"/APR/",$5)
       gsub(/-05-/,"/MAY/",$5)
       gsub(/-06-/,"/JUN/",$5)
       gsub(/-07-/,"/JUL/",$5)
       gsub(/-08-/,"/AUG/",$5)
       gsub(/-09-/,"/SEP/",$5)
       gsub(/-10-/,"/OCT/",$5)
       gsub(/-11-/,"/NOV/",$5)
       gsub(/-12-/,"/DEC/",$5)
       $11=$11=="CARTE"?"CB":"CH"
       a=$1b$2b$3b$5b$6b$7
       ++c[a]
       e[a]=e[a]$8b$9b$10b$11b
       g[a]=g[a]+$12  
    }
    END {
       for(i in c)print c[i]b g[i]b i b e[i]
    }

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    j'appliquerais plus simplement les actions s'il y a un un nombre de champs (NF).

    on ne voit pas de ligne vide dans le fichier présenté dans ton premier message de ce sujet.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Pour la date, tu as les fonctions mktime et strftime de gawk :
    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
    $ cat f
    "DUPONT","HENRI","PARIS","FR","12-08-1950","123456789","FR12345","GU","120","EUR","CARTE","11"
    "DUPONT","HENRI","PARIS","FR","12-08-1950","123456789","FR12345","GU","120","EUR","CARTE","11"
    "MARTIN","LUCIEN","PARIS","FR","20-02-2000","412566655","FR43333","GA","420","EUR","CHEQUE","1"
    "LECOMTE","CATHERINE","PARIS","FR","21-08-1989","842216654","FR8523","GC","25000","EUR","CARTE","15"
    "MARTIN","JACQUES","PARIS","FR","21-08-1902","9876543210","FR456788","GA","3600","EUR","CHEQUE","58"
    "MARTIN","JACQUES","PARIS","FR","21-08-1902","9876543210","FR456788","GC","25000","EUR","CARTE","120"
    $
    $ LC_ALL=C gawk -F'","' '{split($5,a,"-"); print strftime("%d/%^b/%Y",mktime(a[3]" "a[2]" "a[1]" 00 00 00"))}' f
    12/AUG/1950
    12/AUG/1950
    20/FEB/2000
    21/AUG/1989
    21/AUG/1902
    21/AUG/1902
    $
    Voir man gawk pour le format à passer à mktime, et man date pour le format à passer à strftime.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    on ne voit pas de ligne vide dans le fichier présenté dans ton premier message de ce sujet.
    Hum. Ça, c'est plutôt le forum qui estropie les fichiers en ôtant les lignes vides à la fin.

    J'ai toujours la ligne "parasite" dans le fichier résultat.csv
    Et oui. Le débogage, c'est ton travail.

    Pour pas rester coite, tu peux, par exemple, afficher le numéro de ligne dans ton résultat final afin de détecter la provenance.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Effectivement, c'est le forum qui estropie les fichiers en ôtant les lignes vides à la fin
    (quand on ouvre le fichier avec Notepad, on va que la dernière ligne est vide)

    fichier.zip

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Tu as 2 problèmes :

    • La norme POSIX impose que toute ligne finisse par "\n". Ce qui n'est pas le cas de ce que tu as posté.
    • La "dernière ligne" n'est pas vide puisqu'elle contient une espace.

    Apprends de cette mésaventure car cela va se reproduire. Un simple cat fichier.csv ou cat -A fichier.csv ou od -c fichier.csv ou od -t x1 fichier.csv montre le problème. 0a est la fin de ligne (\n) et 20 est l'espace après la fin de ligne, ce qui ne devrait pas être.

    En tout cas, plutôt que recourir à l'astuce !NF{next;}, tu peux explicitement indiquer /^[[:blank:]]*$/{next;} à la place.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

Discussions similaires

  1. Suppression de la dernière ligne d'un fichier XML
    Par Surinox dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 01/02/2017, 16h15
  2. [Batch] Suppression de la dernière ligne d'un fichier.
    Par cycy75 dans le forum Scripts/Batch
    Réponses: 14
    Dernier message: 02/05/2016, 15h52
  3. Réponses: 1
    Dernier message: 28/01/2010, 20h23
  4. Suppression de la dernière ligne d'une sélection
    Par Damss dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/03/2009, 10h31
  5. suppression de la dernière ligne vide d'un fichier text en VB6
    Par zcoul dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 23/07/2007, 19h45

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