web-dev-qa-db-ja.com

最大値と最小値を見つけて、ファイルから行を印刷する

最初の列に数字があるファイルがあります。

100,red
101,blue
102,black

最大数と最小数の行を印刷するシェルスクリプトを作成する必要があります。

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

これは、最大値を見つけるためにこれまで試したものです。

13
hackio

最小値の場合:

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

最大値の場合:

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

別の方法として、sortおよびsedを使用する

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

-nフラグ-数値としてソートします。

どうやって使うのですか:

$ 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

GNU awkがある場合は、awkですべてを行う必要があります。

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

しない場合:

$ 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

または、最初と最後の行を事前ソートして印刷します。

$ 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

ソートされた要素を使用して配列を作成します。最初と最後の要素には、最小値と最大値が含まれています

2
abasu