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 :

Amelioration script de merge avec awk


Sujet :

Linux

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Octobre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Octobre 2011
    Messages : 21
    Points : 8
    Points
    8
    Par défaut Amelioration script de merge avec awk
    Bonjour,
    j'ai le script suivant qui me sert à partir d'un fichier source, à concaténer les lignes qui sont découpées par erreur.
    Exemple en entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    EMP1,S1,123,
    H1W,BOX1
    EMP2,S2,456,3R9,BOX2
    EMP4,S4,789
    ,H9F,BOX3
    Je dois avoir en sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    EMP1,S1,123,,H1W,BOX1
    EMP2,S2,456,3R9,BOX2
    EMP4,S4,789,,H9F,BOX3
    Notez au passage qu'une ligne peut être tronquée avant ou après la virgule.

    Le script que j'ai développé fonctionne bien mais j'aimerais l'améliorer (réduire le nombre d'étapes). Voici ce que j'ai fait :

    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
    #!/bin/sh
     
    echo "Input file : " $1
    echo
     
    # 1. Ecriture dans text2.txt des lignes avec ajout de "badline" pour les lignes incompletes (moins de 5 champs)
    cat $1 | awk -F',' '{if (NF < 5 ) print "badline "$0; else print $0}' > test2.txt
     
    # 2. Concatenation des lignes "badline" avec suppression du \n.
    cat test2.txt | grep badline | sed 'N;s/\n/,/' | sed 's/badline //g' > testout_bad.txt
     
    # 3. Redirection des lignes completes dans testout_good.txt
    cat test2.txt | sed -n '/badline/!p' > testout_good.txt
     
    # 4. Fusion des lignes incompletes et completes dans testout.txt
    cat testout_good.txt testout_bad.txt | sort > testout.txt
     
    cat testout.txt
    J'ai tenté de jouer avec awk (next, ...) mais sans succès. Merci d'avance si vous avez une idée !

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

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cat fichier.in
    EMP1,S1,123,
    H1W,BOX1
    EMP2,S2,456,3R9,BOX2
    EMP4,S4,789
    ,H9F,BOX3
    awk -F',' '{if( NF < 5 ){ badline=$0; getline; print badline""$0 } else {print} }' fichier.in
    EMP1,S1,123,H1W,BOX1
    EMP2,S2,456,3R9,BOX2
    EMP4,S4,789,H9F,BOX3
    edit:
    en un petit peu plus court :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F',' '( NF < 5 ){ printf("%s",$0); getline} {print}' fichier.in
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Octobre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Octobre 2011
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cat fichier.in
    EMP1,S1,123,
    H1W,BOX1
    EMP2,S2,456,3R9,BOX2
    EMP4,S4,789
    ,H9F,BOX3
    awk -F',' '{if( NF < 5 ){ badline=$0; getline; print badline""$0 } else {print} }' fichier.in
    EMP1,S1,123,H1W,BOX1
    EMP2,S2,456,3R9,BOX2
    EMP4,S4,789,H9F,BOX3
    edit:
    en un petit peu plus court :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F',' '( NF < 5 ){ printf("%s",$0); getline} {print}' fichier.in
    Merci bien !
    j'avais pourtant fait un truc similaire mais ça ne marchait pas, je ne sais pas pourquoi.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Octobre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Octobre 2011
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Juste une question : je souhaite faire quelque chose de plus générique et donc je passe en paramètre le fichier source ainsi que le nombre de champs à trouver.
    Mais en sortie le résultat n'est pas bon, alors que l'affichage de ma variable (pour le nombre de champs) est bon.

    declare -r c_INPUT_FILE=$1
    declare -r c_OUTPUT_FILE="ffoutput.txt"
    declare -i c_NB_FIELDS=$2

    echo "Input file :" $c_INPUT_FILE
    echo "Nb fields :" $c_NB_FIELDS
    echo

    awk -F',' '( NF < $c_NB_FIELDS ){ printf("%s",$0); getline} {print}' $c_INPUT_FILE > $c_OUTPUT_FILE
    Sortie :
    Input file : test1.txt
    Nb fields : 5

    EMP1,S1,123,H1W,BOX1
    EMP2,S2,456,3R9,BOX2EMP4,S4,789
    ,H9F,BOX3
    EMP1 est bien reconstruit mais EMP2 est concaténé avec EMP4 alors qu'il est complet. On dirait qu'il y a un décalage...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    c'est parce que les variables ne sont pas développées entre guillemets simples.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -v nbFields="$c_NB_FIELDS" -F',' '( NF < nbFields ){ printf("%s",$0); getline} {print}' $c_INPUT_FILE > $c_OUTPUT_FILE
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Octobre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Octobre 2011
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    c'est parce que les variables ne sont pas développées entre guillemets simples.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -v nbFields="$c_NB_FIELDS" -F',' '( NF < nbFields ){ printf("%s",$0); getline} {print}' $c_INPUT_FILE > $c_OUTPUT_FILE
    Ok, donc je ne peux pas utiliser de variable dans la fonction alors, du moins entre les guillemets simples ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    je ne peux pas utiliser de variable dans la fonction alors, du moins entre les guillemets simples ?
    Si, tu peux les passer à awk en utilisant l'option -v -v var="valeur", ou --assign --assign=var="valeur".
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Octobre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Octobre 2011
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    c'est parce que les variables ne sont pas développées entre guillemets simples.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -v nbFields="$c_NB_FIELDS" -F',' '( NF < nbFields ){ printf("%s",$0); getline} {print}' $c_INPUT_FILE > $c_OUTPUT_FILE
    Bon, je m'en suis sorti mais il y a sûrement plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo "awk -F',' '( NF < $c_NB_FIELDS ){ printf(\"%s\","'$0'"); getline} {print}' $c_INPUT_FILE > $c_OUTPUT_FILE" > exec_cmd.sh
    chmod +x ./exec_cmd.sh
    ./exec_cmd.sh

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    quel horreur !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Octobre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Octobre 2011
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    quel horreur !
    Merci du compliment !

    Bon alors quelle serait la bonne syntaxe ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    celle que je t'ai montrée plus haut, au #7.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Octobre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Octobre 2011
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    celle que je t'ai montrée plus haut, au #7.
    Ah j'avais pas vu ! oui c'est vrai j'aurais du penser à cette solution de variables.
    Merci encore !

Discussions similaires

  1. Réponses: 7
    Dernier message: 17/02/2012, 11h57
  2. script shell : probleme avec sed et awk
    Par salseropom dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 05/06/2007, 11h57
  3. Réponses: 33
    Dernier message: 15/10/2004, 16h19
  4. Problème sur une cmd avec AWK
    Par OrangeBud dans le forum Linux
    Réponses: 3
    Dernier message: 02/06/2004, 10h51
  5. Script assez difficile avec random
    Par LFC dans le forum Requêtes
    Réponses: 6
    Dernier message: 01/08/2003, 18h02

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