Trier la somme des nombres

gcm -  
 gcm -
Bonjour à tous, je bloque sur un exercice depuis un moment, si quelqu'un peut m'aider s'il vous plait!

Écrire un script, nommé sommeNombresEtTri, prenant sur son flux d'entrée des lignes contenant deux entiers naturels, séparés par un signe d'addition, possiblement entourés de blancs, les sommant et triant le résultat par ordre décroissant de somme.
% cat data
1 + 2
3+4
1 +3
% sommeNombresEtTri < data
3 + 4 = 7
1 + 3 = 4
1 + 2 = 3

J'ai tenté d'y répondre avec awk, cependant cela ne marcche pas sur tous les exemples:

#! /bin/bash
awk -F '+' '{ print $1 "+" $2 " = " $1+$2 }'

Merci

2 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    Une solution avec "sort" :

    awk -F '+' '{ print $1 "+" $2 " = " $1+$2 }'  data | sort -r -t '=' +1

    ;-))
    0
    1. gcm
       
      slt! il y a un truc que je ne comprend pas; le +1 c'est quoi??
      0
    2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      Ca ne marche pas chez moi
      ~$ cat fic
      110 + 2
      32+4
      10 +3 
      ~$ awk -F '+' '{ print $1 "+" $2 " = " $1+$2 }'  fic 
      110 + 2 = 112
      32+4 = 36
      10 +3  = 13
      ~$ awk -F '+' '{ print $1 "+" $2 " = " $1+$2 }'  fic | sort -r -t '=' +1
      sort: échec d'ouverture: +1: Aucun fichier ou dossier de ce type
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Re-

      Le champ à prendre en compte. Ici c'est le 2ème champ vu qu'on a défini le délimiteur comme étant "=" (-t '='), et sous cette forme les champs commencent à zéro :
      0 1 2 3 etc
      Donc le 2ème est 1.

      Avec la forme employée par "lami20j" ci-dessous (-k 2), les champs comment à 1.
      0
    4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

      Bizarre ;-\

      $ awk -F '+' '{ print $1 "+" $2 " = " $1+$2 }'  data
      1 + 2 = 3
      3+4 = 7
      1 +3 = 4
      
      $ awk -F '+' '{ print $1 "+" $2 " = " $1+$2 }'  data | sort -r -t '=' +1
      3+4 = 7
      1 +3 = 4
      1 + 2 = 3
      0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,
    :~$ cat fic
    110 + 2
    32+4
    10 +3 
    :~$ awk -F'[ +]+' '{ print $1 " + " $2 " = " $1+$2 | "sort -t= -k 2 -n"}' fic
    10 + 3 = 13
    32 + 4 = 36
    110 + 2 = 112
    :~$ awk -F'[ +]+' '{ print $1 " + " $2 " = " $1+$2 | "sort -t= -k 2 -nr"}' fic
    110 + 2 = 112
    32 + 4 = 36
    10 + 3 = 13
    
    0
    1. gcm
       
      merci lami!
      cependant pourrais-tu m'expliquer stp certaines choses que je ne saisis pas ?
      awk -F' [ + ] + ' .... : à qoui servent les crochets?
      et pourquoi y a t-il 2 + ?
      sort -t= -k 2 -nr : que signifie -t= ??

      Merci
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Petit réflexe à adopter, lire les pages de "man" ;-))

      Extrait du man sort :

             -t, --field-separator=SEP 
                    use SEP instead of non-blank to blank transition

      Bonus :
      -t caractère_séparateur
          Utiliser le caractère_séparateur afin de distinguer les champs pour rechercher la clé de tri sur chaque ligne. Par défaut le séparateur de champs est une chaîne blanche entre chaînes non-blanches. Ceci signifie qu'avec l'entrée ' foo bar', sort distingue deux champs ' foo' et ' bar'. Le séparateur n'appartient ni au champ précédent, ni au champ suivant.
      0
    3. gcm
       
      merci
      0
    4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      [ +]+ c'est une regex, plus exacte c'est une classe de caractères (les crochets) qui contient un espace et un signe +
      Le + à l'extérieur de la classe (les crochets) est un quantificateur

      On peu utiliser '+' mais en ce cas regarde l'affichage

      :~$ awk -F'+' '{ print $1 " + " $2 " = " $1+$2 | "sort -t= -k 2 -n"}' fic
      10  + 3  = 13
      32 + 4 = 36
      110  +  2 = 112
      r:~$ awk -F'[ +]+' '{ print $1 " + " $2 " = " $1+$2 | "sort -t= -k 2 -n"}' fic
      10 + 3 = 13
      32 + 4 = 36
      110 + 2 = 112
      0
    5. gcm
       
      Thanx!
      0