Forum Programmation.shell rechercher dans une colonne le chiffre le plus grand le plus petit

Posté par  . Licence CC By‑SA.
Étiquettes :
-1
3
nov.
2015

Bonjour

Je cherche la meilleur manière de récupérer dans une colonne le nombre le plus grand et le plus petit

cat mon_fichier.txt | cut -d";" -f4 | sort -n
5
7
9
15
16

Si je fais:
cat mon_fichier.txt | cut -d";" -f4 | sort -n | tail -1
16
m'affiche le plus grand

si je fais:
cat mon_fichier.txt | cut -d";" -f4 | sort -r | tail -1
-r pour reverse
me donne 15
c'est pas bon

Sinon j'ai pensée a ça:
cat mon_fichier.txt | cut -d";" -f4 | sed '1,${$b;d}'
m'affiche : 5 le nombre le plus petit

cat mon_fichier.txt | cut -d";" -f4 | sed '1,${1b;d}'
m'affiche : 16 le nombre le plus grand

Ceci semble bien fonctionner mais j'ai des doutes car si dans ma colonne il y a un caractère blanc
tout devient faux.
il faudrait si y a un caractère blanc de prendre que les chiffres ou alors de le remplacer par zéro.

Quelqu'un a une petite idée ?
D'avance merci pour toutes réponses.

  • # UUOC

    Posté par  (site web personnel, Mastodon) . Évalué à 4. Dernière modification le 03 novembre 2015 à 12:11.

    Cinq d'un coup, joli score…

    Ceci dit, il ne manque pas une option -n quelque part ?

  • # man head; man tr

    Posté par  . Évalué à 1.

    tout est dans le titre

    Je sais, c'est facile quand on sait quoi chercher

  • # avec awk

    Posté par  . Évalué à 3. Dernière modification le 03 novembre 2015 à 12:25.

    En supposant que tu veux appliquer l'expressiion sur le 4eme champ :

    awk ' NR == 1 {max=$4} {if (max < $4) {max=$4}}END {print max}' toto.txt
    

    Tu remplace $4 par $numero_du_champ que tu veux traiter.

    • [^] # Re: avec awk

      Posté par  . Évalué à 3. Dernière modification le 03 novembre 2015 à 12:32.

      Encore mieux :

      awk -v field=2 'NR == 1 {max=$field} {if (max < $field) {max=$field}}END {print max}' toto.txt
      

      dans l'appel de awk, tu passe la variable field=no_de_colonne(ici je recherche le max sur la 2eme colonne)

      mon fichier toto.txt contient :

      2 5 6 7
      1 4 3 2
      15 22 34 56
      33 12 0 0
      

      L'exécution donne :

      awk -v field=2 'NR == 1 {max=$field} {if (max < $field) {max=$field}}END {print max}' toto.txt
      22
      
      • [^] # Re: avec awk

        Posté par  . Évalué à 4.

        Il veut aussi le nombre le plus petit et le séparateur de champ est visiblement un point-virgule avec éventuellement des espaces autour. Dans la même idée, on peut tenter:

        awk -F' *; *' -vF=4 '
          BEGIN{ getline; MAX=MIN=$F }
          (MAX < $F){ MAX=$F }
          (MIN > $F) { MIN=$F }
          END{ print MIN, MAX }' FICHIER
        • [^] # Re: avec awk

          Posté par  . Évalué à 2.

          Je ne voulais pas donner la solution "tout cuit" :) mais effectivement c'est ce que j'avais en tête (à la différence près du BEGIN+getline par rapport à mon test sur NR).

      • [^] # Re: avec awk

        Posté par  . Évalué à 1.

        Bonjour,

        Merci cette solution est bonne.
        awk -v field=2 'NR == 1 {max=$field} {if (max < $field) {max=$field}}END {print max}' toto.txt

        Merci à tous pour vos réponses.

  • # the man you must read, LUKE

    Posté par  . Évalué à 5. Dernière modification le 03 novembre 2015 à 13:04.

    cat mon_fichier.txt | cut -d";" -f4 | sort -n | tail -1`
    16

    m'affiche le plus grand
    si je fais:

    cat mon_fichier.txt | cut -d";" -f4 | sort -r | tail -1

    -r pour reverse
    me donne 15
    c'est pas bon

    parce que ton classement n'est plus "numerique" car tu as enlevé le -n à sort.

    cat mon_fichier.txt | cut -d";" -f4 | sort -nr | tail -1

    pourrait donner le resultat attendu
    sinon tu gardes la ligne de depart,
    mais tu prend la premiere (head) au lieu de la derniere (tail)

    cat mon_fichier.txt | cut -d";" -f4 | sort -n | head -1

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.