17

我有一个文件,第一列有数字。

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

这是我迄今为止尝试找到最大值的方法。

4

5 回答 5

36

对于最小值:

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

对于最大值:

[bash]$ cut -f1 -d"," file_name | sort -n | tail -1
于 2015-08-22T16:19:31.177 回答
13

或者使用 sort 和 sed

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

-nflag - 按数字排序。

如何使用它:

$ 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
于 2013-04-25T10:48:49.587 回答
6

awk如果你有,你应该做所有的事情GNU 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
于 2013-04-25T10:33:16.927 回答
3
[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

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

于 2013-04-25T10:47:46.337 回答
2

在 zip CSV 文件中

对于最小值

bzcat file.csv.bz2 | cut -f2 -d";" | sort -n | head -2

对于最大值

bzcat file.csv.bz2 | cut -f2 -d";" | sort -n | tail -1

各位,

阿里

于 2019-12-11T09:24:30.940 回答