Unix shell查找最大值和最小值并从文件中打印行

我有一个在第一列有数字的文件。

100,red 101,blue 102,black 

我应该写一个shell脚本,它将打印最大和最小数字的行。

 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 

这是我迄今为止所发现的最大值。

最小值:

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

最大值:

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

或者使用排序和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 

如果你有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 

或者preort并打印第一行和最后一行:

 $ sort -t',' -nk1 file | awk 'NR==1;END{print}' 100,red 102,black 
 [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 

使用排序元素创建一个数组。 第一个和最后一个元素包含最小值和最大值