Trier la somme des nombres

Fermé
Signaler
-
 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

Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 485
Salut,

Une solution avec "sort" :

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

;-))
slt! il y a un truc que je ne comprend pas; le +1 c'est quoi??
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 562
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
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 485
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.
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 485
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
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 562
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
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
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 485
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.
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 562
[ +]+ 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