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 POSIX Discussion :

Cumul de colonnes et IF


Sujet :

Shell et commandes POSIX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 60
    Par défaut Cumul de colonnes et IF
    Bonjour,

    j'ai un fichier en entrée qui a ce genre d'enregistrements :

    005480546 5469523 1463 6823 1337
    005520077 651125 3441 19482 7023
    005520176 6711470 0 877739 11011
    005520242 7193354 45253 365735 74591

    je souhaite faire un script qui pour chaque ligne du fichier fait le cumul des colonnes 2,3,4 et 5. Si le total est supérieur à disons 500000 alors je copie l'enregistrement dans toto.txt sinon (total inférieur à 500000) je copie l'enregistrement dans tata.txt.
    Je ne maitrise pas bien le AWK. Pourriez-vous m'aider ? Merci.

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    par exemple tu peux faire l'affichage des résultats comme ça si tu maitrises pas awk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ while read                                                   
    > do                                                           
    > echo $REPLY | awk '{print $2" " $3"+ " $4"+ " $5"+ pq"}' | dc
    > done < /tmp/toto                                             
    5479146
    681071
    7600220
    7678933
    $
    tu charges ces résultats dans une table (variable)
    et tu gères

    ce qui devient donc
    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
    $ while read                                                                                 
    > do                                                                                         
    > if [ $( echo $REPLY | awk '{print $2" " $3"+ " $4"+ " $5"+ pq"}' | dc ) -gt 500000 ] ; then
    >   echo $REPLY >> /tmp/grand.txt                                                            
    > else
    >   echo $REPLY >> /tmp/petit.txt                                                            
    > fi                                                                                         
    > done < /tmp/toto                                                                           
    $ cat /tmp/grand.txt 
    005520242 7193354 45253 365735 74591
    005480546 5469523 1463 6823 1337
    005520077 651125 3441 19482 7023
    005520176 6711470 0 877739 11011
    005520242 7193354 45253 365735 74591
    $
    y'a beaucoup mieux et optimisé mais là ça reste compréhensible par un débutant

    bien sur tu peux faire la comparaison et le conditionnement directement dans awk pour optimiser.

  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
    en awk purement :

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ awk '{sum=$2+$3+$4+$5; if (sum > 800000) {print $0 >> "toto.txt"} else {print $0 >> "tata.txt"}}' <<EOF
    005480546 5469523 1463 6823 1337
    005520077 651125 3441 19482 7023
    005520176 6711470 0 877739 11011
    005520242 7193354 45253 365735 74591
    EOF
    $ du -b *
    33      tata.txt
    103     toto.txt
    $ cat tata.txt
    005520077 651125 3441 19482 7023
    $ cat toto.txt
    005480546 5469523 1463 6823 1337
    005520176 6711470 0 877739 11011
    005520242 7193354 45253 365735 74591

    print $0 >> fichier correspond à la ligne entière mais selon le besoin on peut aussi préférer print $1 " : " total >> fichier par exemple pour afficher le 1er champs et le total avec un formatage

  4. #4
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonjour.

    Sinon une solution en shell sans awk :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/sh
     
    # On écrase les fichiers de sortie
    [ -f toto.txt ] && rm -rf toto.txt
    [ -f tata.txt ] && rm -rf tata.txt
     
    while read line; do
        set -- $line
        let cumul=$2+$3+$4+$5
        [ $cumul -gt 500000 ] && echo $line >> toto.txt || echo $line >> tata.txt
    done < fichier.txt
    Démonstration :

    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
    [idriss@hp-dv6:~]$ cat fichier.txt 
    005480546 5469523 1463 6823 1337
    005520077 651125 3441 19482 7023
    005520176 6711470 0 877739 11011
    005520242 7193354 45253 365735 74591
    4000 3000 2000 1000 150
    [idriss@hp-dv6:~]$ ./script.sh 
    [idriss@hp-dv6:~]$ cat toto.txt 
    005480546 5469523 1463 6823 1337
    005520077 651125 3441 19482 7023
    005520176 6711470 0 877739 11011
    005520242 7193354 45253 365735 74591
    [idriss@hp-dv6:~]$ cat tata.txt 
    4000 3000 2000 1000 150
    [idriss@hp-dv6:~]$
    Cordialement,
    Idriss

Discussions similaires

  1. [Artichow] Histogramme Cumulé les Colonnes
    Par BenJ69 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 04/01/2011, 16h33
  2. [SSRS] Faire du cumul de colonne
    Par remsrock dans le forum SSRS
    Réponses: 1
    Dernier message: 02/03/2010, 16h14
  3. Problème de cumule dans une colonne
    Par gadjo72 dans le forum Débuter
    Réponses: 5
    Dernier message: 24/04/2008, 21h24
  4. Réponses: 9
    Dernier message: 16/04/2008, 18h47
  5. Réponses: 2
    Dernier message: 29/03/2007, 11h34

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