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 :

Calcul moyenne et division sur le nombre de lignes avec séparateur et avec awk


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai Avatar de Shyma
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 100
    Points : 19
    Points
    19
    Par défaut Calcul moyenne et division sur le nombre de lignes avec séparateur et avec awk
    Bonjour,

    J'ai besoin d'aide pour faire des opérations, calculer la moyenne et diviser sur le nombre de ligne qu'il y a entre le séparateur de lignes, qui est différent (separateur1, separateur2 ..... separateurN)
    j'ai mon fichier qui est sous cette forme :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     separateur1
    premier          abc    12 09 6            personne=nom1 17 20;                                               moyenne (20+17)
    premier          abc     11 9  6            personne=nom1 16 19 ;                                                (19+16)
    premier         abc     30 9 15           personne=nom1 14 19 ;                                                 (14+19) =======>Additionner les trois et les diviser sur 3 
    separateur2
     
    deuxième       abc     5 7 9            personne=nom2 15 17  ;                                               (15+17)
    deuxième       abc     56 5 9          personne=nom2 10 20  ;                                                 (10+20)
    deuxième      abc     8 9 4           personne=nom2  8 13;                                                       (13+8)
    deuxième     abc    1 56 7           personne=nom2 5 12 ;                                                        (12+5)  ====> Additionner les 4 et les diviser sur 4

    J'espère que c'est assez clair comme explication.

    Merci

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    à voir, mais je crois que la précédente discussion (identique) a été délaissée parce que personne ne comprenait le problème (ou qu'il n'était pas posé de manière suffisamment claire, au choix)

    l'emploi d'un jargon adéquat (pas obligatoirement technique), les exemples "avant-après", l'utilisation de codes couleurs, se mettre à la place de son interlocuteur pour lequel certaines choses ne coulent pas de source etc. sont autant d'outils pour se faire comprendre, et par corolaire se faire aider

    pour le moins, le fichier que tu donnes en exemple est mal formatté (des espaces un peu partout, pas sur chaque ligne etc.), on est d'accord que c'est volontaire et que ça reflète bien le fichier tel qu'il peut réellement être ?
    aussi tu donnes le fichier de départ, est-ce que sur la base de ce même fichier tu peux donner l'exemple de fichier d'arrivée/en sortie ?
    toute précision complémentaire sera évidement la bienvenue, mieux vaut trop que pas assez en l'occurrence

  3. #3
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 277
    Points : 12 722
    Points
    12 722
    Par défaut
    De toute façon, awk ne sait pas évaluer une chaîne de caractère de type mathématique comme par exemple (20+17).
    Cordialement.

  4. #4
    Membre à l'essai Avatar de Shyma
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 100
    Points : 19
    Points
    19
    Par défaut
    @ disedorgue
    Tu veux dire quoi avec ta réponse ?

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 277
    Points : 12 722
    Points
    12 722
    Par défaut
    Lorsque awk récupère une donnée dans un fichier, il considère celle-ci comme une chaine de caractère et de ce fait, quand il récupère (20+17), il ne voit que la chaine de caractère et non la donnée arithmétique, il ne saura donc pas l'évaluer.
    Cordialement.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Pas chez moi!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo "17 20" | awk '{print $1+$2}'
    37
    $ awk --version
    awk version 20070501
    À moins que tu ne veuilles dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "17+20" | awk '{print $1}'
    17+20
    mais ce n'est pas le cas dans le travail demandé

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 277
    Points : 12 722
    Points
    12 722
    Par défaut
    C'est bien du deuxième cas que je parlais, après à savoir si ce n'est pas le travail demander, tu as peut-être raison, mais ce n'est vraiment pas clair...

    On dirait des specs du Marketting
    Cordialement.

  8. #8
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    C'est bien du deuxième cas que je parlais, après à savoir si ce n'est pas le travail demander, tu as peut-être raison, mais ce n'est vraiment pas clair...
    à mon avis c'est des commentaires et ça n'est pas réellement à évaluer, après le PO ne semble pas plus pressé que ça de désambigüiser donc je m'embêterai pas à chercher plus loin non plus.

    On dirait des specs du Marketting
    j'avoue...

  9. #9
    Membre à l'essai Avatar de Shyma
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 100
    Points : 19
    Points
    19
    Par défaut
    Salut et désolée si je n'ai pas répondu. En effet à droite c'est des commentaires pour mieux expliquer !
    Enfin, j'ai trouvé une méthode plus simple de faire mes calculs, mais je ne sais pas coté code, est-ce que ça va être plus difficile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    separateur1
    premier          abc    12 09 6            personne=nom1 17 20;                                              
    premier          abc     11 9  6            personne=nom1 16 19 ;                                                
    premier         abc     30 9 15           personne=nom1 14 19 ;                                         
    separateur2
     
    deuxième       abc     5 7 9            personne=nom2 5 17  ;                                           
    deuxième       abc     56 5 9          personne=nom2 10 20  ;                                               
    deuxième      abc     8 9 4           personne=nom2  8 13;                                                       
    deuxième     abc    1 56 7           personne=nom2 5 12 ;
    Je voudrais pour chaque bloc faire cette opération :
    Pour le bloc 1 avec le séparateur1 : faire (19-17)
    Pour le bloc 2, faire l'opération faire (12-5)

    J'ai pu faire la moyenne , en délimitant avec le mot " séparateur", et utiliser $FN, $(FN-1). Mais pour ce cas de figure, je ne sais pas comment prendre de la première ligne , juste après le mot "séparateur" l'avant dernier nombre, avec le dernier nombre de la dernière ligne de ce même bloc ?

    Encore une fois, excusez mes explications ! Je ne sais pas si j'ai bien expliqué

  10. #10
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    tu donnes le fichier de départ, est-ce que sur la base de ce même fichier tu peux donner l'exemple de fichier d'arrivée/en sortie ?

  11. #11
    Membre à l'essai Avatar de Shyma
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 100
    Points : 19
    Points
    19
    Par défaut
    Alors un exemple de fichier de sortie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    separateur1   2
    premier          abc    12 09 6            personne=nom1 17 20;                                              
    premier          abc     11 9  6            personne=nom1 16 19 ;                                                
    premier         abc     30 9 15           personne=nom1 14 19 ;                                         
    separateur2   7
     
    deuxième       abc     5 7 9            personne=nom2 5 17  ;                                           
    deuxième       abc     56 5 9          personne=nom2 10 20  ;                                               
    deuxième      abc     8 9 4           personne=nom2  8 13;                                                       
    deuxième     abc    1 56 7           personne=nom2 5 12 ;

  12. #12
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    • "separateur" est un mot clé en début de ligne qui délimite un le commencement d'un nouveau bloc, et la fin du bloc précédent
    • les lignes vides n'ont pas de signification et sont à ignorer
    • chaque ligne d'un bloc (hors ligne contenant le mot "separateur") se termine par 2 nombres (appelons les titi et toto), suivi d'un point-virgule "un peu encombrant"
    • le but étant pour chaque bloc, d'ajouter à la suite de la ligne separateur la différence entre le dernier toto du bloc et le premier titi de ce même bloc


    ça n'a rien de simple notamment dû au fait qu'il faut stocker des valeurs pour les utiliser plus tard, réécrire des lignes déjà passées etc.
    la seule solution que je vois c'est à coups de awk et en stockant l'intégralité du fichier en mémoire (un tableau de lignes), à la fin on affiche le nouveau fichier à l'écran

    en pseudo-code :
    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
    si on voit "separateur" {
       si c'est la première fois {
          on ne fait rien, on stocke juste la position de ce séparateur pour pas l'oublier
       } sinon {
          on modifie la ligne du précédent séparateur en lui rajoutant (dernier toto - premier titi) en bout de ligne
       }
       dans tous les cas on passe de l'état 0 à l'état 1, et on s'arrête là, on va lire une autre ligne dans le fichier
    }
    
    si on est en état 1 {
       dans ce cas on récupère l'avant dernier nombre: c'est le premier titi du bloc, et on repasse à l'état 0
    } sinon {
       pour chaque ligne qu'on lit, on garde le dernier nombre de la ligne, c'est le dernier toto en date
       et lorsqu'on arrivera sur le séparateur ce sera même le dernier toto de tout le bloc
    }
    en 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #!/usr/bin/awk -f
    BEGIN {
       first_time = 1;                                 # 1ere fois quon voit le separateur ? on pourrait sen passer, juste question de lisibilité...
    }
     
    {
       line[cpt] = $0;                                 # on stocke chaque ligne dans un tableau
    }
     
    /^[ \t]*$/ {                                       # on zappe les lignes vides, mais on veut les garder pour affichage à la fin
       cpt++;
       next;
    }
     
    /^separateur/ {                                    # si on voit le séparateur
       if (first_time) {                               # si cest la première fois
          first_time = 0;
       } else {                                        # sinon on modifie le séparateur précédent
          line[last_sep] = line[last_sep] "   " last_toto - first_titi;
       }
       state++
       last_sep = cpt;
       cpt++;
       next;
    }
     
    state == 1 {                                       # on récupère le premier titi du bloc
       gsub(/[ \t]*;[ \t]*$/,"",$0);
       first_titi = $(NF-1);
       state = 0;
    }
     
    {                                                  # sur les autres lignes on récupère toto, dernier arrivé = dernier toto du bloc
       gsub(/[ \t]*;[ \t]*$/,"",$0);
       last_toto = $NF;
       cpt++;
    }
     
    END {                                              # à la fin on affiche tout le fichier
       line[last_sep] = line[last_sep] "   " last_toto - first_titi;  # on oublie pas de modifier la dernière ligne de séparateur
       for(i = 0; i < cpt; i++) {
          print line[i];
       }
    }
    et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ ./script.awk fichier
     
    separateur1   2
    premier          abc    12 09 6            personne=nom1 17 20;
    premier          abc     11 9  6            personne=nom1 16 19 ;
    premier         abc     30 9 15           personne=nom1 14 19 ;
    separateur2   7
     
    deuxième       abc     5 7 9            personne=nom2 5 17  ;
    deuxième       abc     56 5 9          personne=nom2 10 20  ;
    deuxième      abc     8 9 4           personne=nom2  8 13;
    deuxième     abc    1 56 7           personne=nom2 5 12 ;
    (note que le fichier en entrée que tu as fourni contenait une ligne vide en début de fichier, on la retrouve ici à l'identique)

  13. #13
    Membre à l'essai Avatar de Shyma
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 100
    Points : 19
    Points
    19
    Par défaut
    Bonjour

    J'ai essayé ton code @BufferBob, mais cela ne marche pas pour moi. cela m'affiche des erreurs.

    Du coup je voudrais afficher ces valeurs là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      
    separateur1  
    premier          abc    12 09 6            personne=nom1 17 20;                                              
    premier          abc     11 9  6            personne=nom1 16 19 ;                                                
    premier         abc     30 9 15           personne=nom1 14 19 ;                                         
    separateur2  
     
    deuxième       abc     5 7 9            personne=nom2 5 17  ;                                           
    deuxième       abc     56 5 9          personne=nom2 10 20  ;                                               
    deuxième      abc     8 9 4           personne=nom2  8 13;                                                       
    deuxième     abc    1 56 7           personne=nom2 5 12 ;
    Pour avoir ce fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    separateur1   17 19
    premier          abc    12 09 6            personne=nom1 17 20;                                              
    premier          abc     11 9  6            personne=nom1 16 19 ;                                                
    premier         abc     30 9 15           personne=nom1 14 19 ;                                         
    separateur2   5 12
     
    deuxième       abc     5 7 9            personne=nom2 5 17  ;                                           
    deuxième       abc     56 5 9          personne=nom2 10 20  ;                                               
    deuxième      abc     8 9 4           personne=nom2  8 13;                                                       
    deuxième     abc    1 56 7           personne=nom2 5 12 ;

  14. #14
    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
    cela ne marche pas pour moi.
    « ça marche pô » n'est pas une description de ce qu'il se passe.
    cela m'affiche des erreurs.
    ah, d'accord.
    mais quelles erreurs ?!

    et qu'as-tu essayé entre temps ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #15
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 277
    Points : 12 722
    Points
    12 722
    Par défaut
    Citation Envoyé par Shyma Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      
    separateur1  
    premier          abc    12 09 6            personne=nom1 17 20;                                              
    premier          abc     11 9  6            personne=nom1 16 19 ;                                                
    premier         abc     30 9 15           personne=nom1 14 19 ;                                         
    separateur2  
     
    deuxième       abc     5 7 9            personne=nom2 5 17  ;                                           
    deuxième       abc     56 5 9          personne=nom2 10 20  ;                                               
    deuxième      abc     8 9 4           personne=nom2  8 13;                                                       
    deuxième     abc    1 56 7           personne=nom2 5 12 ;
    Tu ne pourrais pas présenter un fichier avec des lignes au format uniforme ?
    Car ici, tu donnes un exemple avec des données non réelles (enfin je suppose), mais pour pouvoir bien travailler, on se fiche un peu de la donnée, ce qui nous intéresse, c'est le format du fichier et le type de donnée pour chacun des champs.
    Exemple:
    Un coup le dernier champs est un ';' , un autre c'est un nombre + ';'.
    Un coup on a une représentation 09 et un autre c'est juste 9.
    Dans un cas, on a separateur suivi directement de ligne à traiter, dans l'autre, on a une ligne vide avant les lignes à traiter.

    En général, on essaye d'avoir déjà un fichier en entrée cohérent, ensuite on le traite.
    Donc, si tu veux de l'aide, déjà, donne nous matière à penser correctement dés le départ en nous décrivant le format de ton fichier avec tous les cas possibles.
    Cordialement.

  16. #16
    Membre à l'essai Avatar de Shyma
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 100
    Points : 19
    Points
    19
    Par défaut
    Salut,
    Oui, excusez moi, le fichier il se présente comme ça.
    Oui, ce n'est pas le fichier d'origine, mais j'ai juste remplacer les variables et les valeurs.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    separateur1  
    premier          abc     12 9 6            personne=nom1 17 20 ;                                              
    premier          abc     11 9  6           personne=nom1 16 19 ;                                                
    premier          abc     30 9 15          personne=nom1 14 19 ;                                         
    separateur2  
    deuxième       abc     5 7 9              personne=nom2 5 17 ;                                           
    deuxième       abc     56 5 9            personne=nom2 10 20 ;                                               
    deuxième       abc     8 9 4              personne=nom2  8 13 ;                                                       
    deuxième       abc     1 56 7            personne=nom2 5 12 ;

  17. #17
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 277
    Points : 12 722
    Points
    12 722
    Par défaut
    Peut-être quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN{RS="separateur"}NR>1{A="separateur"$1" "$8" "$(NF-1);$1="";gsub(/^ |(;) */,"&\n",$0);printf("%s%s",A,$0)}' fichier
    Ce qui donne en code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    BEGIN{
      RS="separateur";
    }
    NR>1{
      A="separateur"$1" "$8" "$(NF-1);
      $1="";
      gsub(/^ |(;) */,"&\n",$0);
      printf("%s%s",A,$0);
    }
    Cordialement.

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Salut,
    J'avais ça mais sans le formatage non spécifié par l'op.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{if(NF==1){if(A)print A" "C" "D B;A=$0;B=""}else{if(!B)C=$(NF-2);B=B"\n"$0;D=$(NF-1)}}END{print A" "C" "D B}' fichier
    Petites remarques:
    1) sur le code
    On peut remplacer le second separateur par RS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN{RS="separateur"}NR>1{A=RS$1" "$8" "$(NF-1);$1="";gsub(/^ |; */,"&\n",$0);printf("%s%s",A,$0)}' fichier
    2) sur le résultat
    La solution est donnée clef en main a l'op qui ne fournit aucun effort.
    Je pense qu'en plus ça ne fonctionnera pas car
    Oui, ce n'est pas le fichier d'origine, mais j'ai juste remplacer les variables et les valeurs.
    En clair l'exemple fournit n'a rien a voir avec l'original !
    Cordialement.

Discussions similaires

  1. Count sur un nombre de lignes d'un CSV
    Par Vlad69 dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 07/10/2013, 13h32
  2. Réponses: 3
    Dernier message: 07/12/2011, 17h22
  3. Calcul sur le nombre de ligne
    Par Chikatilo dans le forum VBA Access
    Réponses: 6
    Dernier message: 06/07/2008, 13h45
  4. Réponses: 2
    Dernier message: 02/10/2006, 11h45
  5. Réponses: 35
    Dernier message: 10/05/2006, 01h11

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