我有一个在第一列有数字的文件。
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
使用排序元素创建一个数组。 第一个和最后一个元素包含最小值和最大值