web-dev-qa-db-fra.com

Recherche des valeurs max et min et impression de la ligne à partir d'un fichier

J'ai un fichier avec des numéros dans la première colonne.

100,red
101,blue
102,black

Je devrais écrire un script Shell pour imprimer la ligne avec les nombres max et min.

max=0
cat file.txt|while read LINE
do
    fir=`echo $LINE|awk '{print $2}'`
    sec=`echo $LINE|awk '{print $3}'`
    if [ $fir -gt $max ]; then
       max=$fir
    fi
    if [ $sec -gt $max ];then
        max=$sec
    fi
done

grep $max file.txt

C'est ce que j'ai essayé jusqu'à présent pour trouver le max.

13
hackio

Pour la valeur min:

[bash]$ cut -f1 -d"," file_name | sort -n | head -1

Pour la valeur maximale:

[bash]$ cut -f1 -d"," file_name | sort -n | tail -1
30
alind

Vous pouvez également utiliser sort et sed

$ sort -n id | sed -n '1p;$p'
100 red
102 black

-n flag - tri sous forme de nombres.

Comment l'utiliser:

$ a=($(sort -n id | sed -n '1s/^\([0-9]\+\).*$/\1/p;$s/^\([0-9]\+\).*$/\1/p'))
$ echo "min=${a[0]}, max=${a[1]}"
min=100, max=102
11
loentar

Vous devriez faire tout cela dans awk si vous avez GNU awk:

$ awk -F, '{a[$1]=$0}END{asorti(a,b);print a[b[1]]"\n"a[b[NR]]}' file
100,red
102,black

Si vous ne le faites pas:

$ awk -F, 'NR==1{s=m=$1}{a[$1]=$0;m=($1>m)?$1:m;s=($1<s)?$1:s}END{print a[s]"\n"a[m]}' file
100,red
102,black

Vous pouvez également trier et imprimer la première et la dernière ligne:

$ sort -t',' -nk1 file | awk 'NR==1;END{print}'
100,red
102,black
5
Chris Seymour
[bash]$ cat log
100,red
101,blue
102,black
[bash]$ all=( $(sort log | cut -f1 -d',') )
[bash]$ echo "MIN: ${all[0]} and MAX: ${all[${#all[@]}-1]}"
MIN: 100 and MAX: 102

Créez un tableau à l'aide des éléments triés. Les premier et dernier éléments contiennent les valeurs min et max

2
abasu