请教如何查找最大值?

sh/bash/dash/ksh/zsh等Shell脚本
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 请教如何查找最大值?

#31

帖子 fnan » 2011-07-09 22:52

换个写法:

代码: 全选

cat n.t
345 7657 7.78 12345678.123456789123456789123456789
435.5667 -5656.676767 -565567.56576767676
32455.45 -12345678.123456789123456789123456789
grep -o '\-*[0-9\.]*' n.t|sort -n|(a=($(sed -n '1p;$p'|xargs));if [[ ${a[0]/-/} == ${a[1]/-/} ]];then echo ${a[*]};else echo ${a[1]};fi)#这样有漏洞。
改一改:
grep -o '[^ ]*' n.t|sort -nu|sed -n 's/\(^\|-\)/x\1x/;1p;$p'|(a=($(sort -tx -nk3));if [[ ${a[0]/-} == ${a[1]/-} ]];then echo ${a[*]//x};else echo ${a[1]//x};fi)
-12345678.123456789123456789123456789 12345678.123456789123456789123456789
cat n.t|perl -lane '$max=abs($F[1]) if abs($F[1])>$max;END{print$max}'
12345678.1234568
这是什么情况呢?
上次由 fnan 在 2011-07-15 7:24,总共编辑 1 次。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
gzbao9999
帖子: 627
注册时间: 2008-11-08 18:34

Re: 请教如何查找最大值?

#32

帖子 gzbao9999 » 2011-07-14 14:58

如果关心这个绝对值最大值对应的是正数or负数

代码: 全选

 grep -Po '[-\d\.]+' file|sort -nr|sed -n '1p;$p;'
不关心的话

代码: 全选

 grep -Po '[\d\.]+' file|sort -nr|head -1
气血鼓荡,身体发胀,偶飘上头,三时舒畅
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 请教如何查找最大值?

#33

帖子 fnan » 2011-07-14 21:12

kose5@kose5-Aspire-4552:~$ cat n.t
345 7657 7.78 12345678.123456789123456789123456789
435.5667 -5656.676767 -565567.56576767676
32455.45 -12345678.1234567891234567891234567891
kose5@kose5-Aspire-4552:~$ grep -Po '[-\d\.]+' n.t|sort -nr|sed -n '1p;$p;'
12345678.123456789123456789123456789
-12345678.1234567891234567891234567891
话说perl不是这么用的,认真对待perl好不好?
(觉得有必要翻翻perl基础教程以展示一下perl的好处)
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 请教如何查找最大值?

#34

帖子 fnan » 2011-07-15 4:53

比较严谨的方法:
cat n.t
345 7657 7.78 12345678.123456789123456789123456789
435.5667 -5656.676767 -565567.56576767676
32455.45 -12345678.1234567891234567891234567891
set $(sed 's/\(-*\)\([0-9.]*\)/\nx\1x\2/g' n.t|sort -tx -nrk3|uniq|head -2);[ ${1//?(-|${2/-})} ] && echo ${1//x} || echo ${*//x}
-12345678.1234567891234567891234567891
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
回复