请教如何查找最大值?

sh/bash/dash/ksh/zsh等Shell脚本
coldweb
帖子: 45
注册时间: 2008-03-22 1:19
送出感谢: 0
接收感谢: 0
联系:

请教如何查找最大值?

#1

帖子 coldweb » 2011-03-11 3:07

有一文件:file
内容如下:
1 2.3 4.5 3.33 5.2
2 4.6 -2.1 -8.9 9.77
3 -10.1 9.9 3.2 4.1
。。。
现在我想查找出这个文件里面从第二列开始到结束列中的绝对值的最大值,如结果为:-10.1
请问要如何处理?
fnan
帖子: 919
注册时间: 2009-07-01 22:04
送出感谢: 0
接收感谢: 13 次

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

#2

帖子 fnan » 2011-03-11 5:32

真的不知道如何取负数的绝对值?
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
HuntXu
论坛版主
帖子: 5778
注册时间: 2007-09-29 3:09
送出感谢: 0
接收感谢: 6 次

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

#3

帖子 HuntXu » 2011-03-11 7:34

代码: 全选

[hunt@psycho ~]$ O_< ./max.pl file 
5.2
9.77
-10.1
[hunt@psycho ~]$ O_< cat file 
1 2.3 4.5 3.33 5.2
2 4.6 -2.1 -8.9 9.77
3 -10.1 9.9 3.2 4.1
[perl]
#!/usr/bin/perl -w
use strict;

foreach (<>) {
chomp;
@_ = split / /;
my $max = $_[1];
foreach (2..$#_) {
$max=$_[$_] if (abs($_[$_])>abs($max));
}
print $max."\n";
}
[/perl]
HUNT Unfortunately No Talent...
头像
trigger
帖子: 1585
注册时间: 2006-10-25 18:08
送出感谢: 0
接收感谢: 0

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

#4

帖子 trigger » 2011-03-11 13:11

[bash]
#! /bin/bash
nums=(`cut -f2- -d' ' file|tr -s ' ' '\n'|sort -n`)

A=${nums[0]}
B=${nums[${#nums[@]}-1]}

[ `echo "${A#-}>${B#-}" | bc` = "1" ] && echo $A || echo $B
[/bash]
楼主真是一派胡言,真可谓:“两个黄鹂鸣翠柳,不知所云;一行白鹭上青天,不知所止“。本来不想和你辩论,今天气愤不过,和你理论一番。我国宪法写得清清楚楚:“一夜夫妻百日恩,七楼以上才有电梯”。这个想必你知道,既然知道,你就不能断章取义,就算是天气预报,它还有不准的时候呢!!!再者说了,那中国银行也不是你一家开的。人家马拉多纳都结婚了,你还拿着粮票顶什么用呢。真是滑天下之大稽。前些日子,全国人大刚刚开过会,郑重声明:“中国不搞多party制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。
fnan
帖子: 919
注册时间: 2009-07-01 22:04
送出感谢: 0
接收感谢: 13 次

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

#5

帖子 fnan » 2011-03-11 20:01

如果有-10.1 10.1随便选一个吗?
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45
送出感谢: 0
接收感谢: 9 次

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

#6

帖子 fanhe » 2011-03-11 22:57

代码: 全选

#!/usr/bin/env python
# -*- encoding:utf-8 -*-

FILE = 'abc.txt'
f = open(FILE)

nums = []
while True:
    line = f.readline()
    if len(line) == 0:
        break
    nums.extend(line.split()[1:])
nums = [float(i) for i in nums]

maxnum = 0.0
for i in nums:
    if abs(i) > abs(maxnum):
        maxnum = i
print maxnum
f.close()
刚刚学python,感谢楼主给了个练习题材
上面能用,自己修改file参数为你的文件,你自己确保文件里面都是数字啊
刚学,但求能搞出结果,不求简洁高效 :em06
以上代码,用

代码: 全选

python <有这代码的文件>
运行
fnan
帖子: 919
注册时间: 2009-07-01 22:04
送出感谢: 0
接收感谢: 13 次

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

#7

帖子 fnan » 2011-03-11 23:58

kose5@kose5-Aspire-4552:~$ cat numbers.txt
1 2.3 4.5 3.33 5.2 10.1
2 4.6 -2.1 -8.9 9.77
3 -10.1 9.9 3.2 4.1
kose5@kose5-Aspire-4552:~$ cut -f2- -d' ' numbers.txt |tr -s ' ' '\n'|sort -n |tr "\n" " " |awk '{print $1" " $NF}'
-10.1 10.1
kose5@kose5-Aspire-4552:~$

-10.1 10.1 绝对值都是10.1, 要lz自己挑了。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
sk1418
帖子: 229
注册时间: 2007-07-01 17:36
系统: (En):System
来自: (En):address
送出感谢: 2 次
接收感谢: 3 次
联系:

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

#8

帖子 sk1418 » 2011-03-12 6:20

awk的

代码: 全选

kent$ awk '{for(i=2;i<=NF;i++) n[$i]=sqrt($i*$i);} END{l=asort(n,t); max=t[l]; print("maxABS: "max); if(max in n)print "Element: " max; if((0-max) in n) print "Element: "0-max } ' t.txt
10.1和 -10.1都有的情况输出:

代码: 全选

maxABS: 10.1
Element: 10.1
Element: -10.1

python的

代码: 全选

#!/usr/bin/python
f = open("sample.txt")
nums=[]
for l in map(lambda y: y.split()[1:], map(lambda x:x.replace("\n",""), f.readlines())):
    nums.extend(map(lambda x:float(x),l))
nums.sort()
print str(nums[0])+" AND "+ str( nums[-1]) if (abs(nums[0]) == abs(nums[-1])) else nums[-1] if (abs(nums[-1])>abs(nums[0])) else nums[0]
f.close()
也是正负都有的情况,输出:

代码: 全选

-10.1 AND 10.1
---
regards,

Kent
fnan
帖子: 919
注册时间: 2009-07-01 22:04
送出感谢: 0
接收感谢: 13 次

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

#9

帖子 fnan » 2011-03-12 7:39

最后完成:
cut -f2- -d' ' numbers.txt |tr -s ' ' '\n'|sort -n |tr "\n" " " |awk '{if ($1*$1 > $NF*$NF) print $1; if ($1*$1 < $NF*$NF) print $NF; if ($1*$1 == $NF*$NF) print $1 " and " $NF}'
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04
送出感谢: 0
接收感谢: 13 次

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

#10

帖子 fnan » 2011-03-12 10:04

用五十万数字测试, 运行不了, 超过极限。 :em06

kose5@kose5-Aspire-4552:~$ awk '{for(i=2;i<=NF;i++) n[$i]=sqrt($i*$i);} END{l=asort(n,t); max=t[l]; print("maxABS: "max); if(max in n)print "Element: " max; if((0-max) in n) print "Element: "0-max } ' s2.t
awk: line 2: function asort never defined
8 楼的asort 函数怎样才能用啊?
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04
送出感谢: 0
接收感谢: 13 次

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

#11

帖子 fnan » 2011-03-12 19:41

无限个数字版
通过五十万数字测试:
已处理了99920行。 用时0小时3分26秒
绝对值最大数: -123456

一共处理了100000行。用时0小时3分26秒

kose5@kose5-Aspire-4552:~$ vim s2.t

然后加了一个绝对值相近的数,也正确找出来了。
已处理了99920行。 用时0小时3分28秒
绝对值最大数: 123456.00000000000000001

一共处理了100000行。用时0小时3分28秒

kose5@kose5-Aspire-4552:~$

代码: 全选

#!/bin/bash

echo -n "输入要处理数字的文本地址:  "
read v_file
if [[ "$(echo $v_file |cut -d'/' -f1)" = '~' ]];then
	v_file=$PWD${v_file#\~}
fi 
echo
echo "开始处理  $v_file  文本:"
echo
v_time1=$(date +%s)
v_numbers=
v_max=

f_show_max()
{
	v_a=$(echo $v_m |cut -d' ' -f1)
	v_b=$(echo $v_m |cut -d' ' -f2)
	va=${v_a#\-}
	vb=${v_b#\-}
	if [[ $(expr index $va '.') > 0 ]];then	
		la=${va#*\.}
		la=${#la}
	else
		la=0
	fi
	if [[ $(expr index $vb '.') > 0 ]];then
		lb=${vb#*\.}
		lb=${#lb}
	else
		lb=0
	fi
	va=${va/\./}
	vb=${vb/\./}
	if [[ $la -gt $lb ]];then
	vb=$vb$(seq $(($la-$lb)) |tr "\n" "a" |tr -d "0-9" |tr "a" "0")
	elif [[ $lb -gt $la ]];then
	va=$va$(seq $(($lb-$la)) |tr "\n" "a" |tr -d "0-9" |tr "a" "0")
	fi
	if [[ $va -gt $vb ]];then
		echo "    绝对值最大数:  $v_a"
	elif [[ $va -lt $vb ]];then
		echo "    绝对值最大数:  $v_b"
	else
		echo "    绝对值最大数:  $v_a    和    $v_b"
	fi
}
f_max()
{
	v_max=$v_max" "$(echo $v_numbers |tr -s " " "\n" |sort -n |tr "\n" " " |awk '{ print $1 " " $NF }')
	v_numbers=
	if [[ ${#v_max} -gt 10000 ]];then
		v_numbers=$v_max
		v_max=
		f_max
	fi
}
f_show_time()
{
		v_time2=$(date +%s)		
		v_time=$(($v_time2 - $v_time1))
		v_h=$(($v_time/60/60))
                v_h=${v_h%\.*}
                v_m=$(($v_time/60))
                v_m=$((${v_m%\.*}-($v_h*60)))
                v_s=$(($v_time - ($v_h*60*60) - ($v_m*60)))
		echo "用时$v_h小时$v_m分$v_s秒"
}
while read v_line;do
	((v_count++))
	v_numbers=$v_numbers" "$v_line
	if [[ ${#v_numbers} -gt 10000 ]];then
		f_max
		echo -n "已处理了$v_count行。  "
		f_show_time
	fi
done < $v_file
if [[ -n $v_numbers ]];then
	f_max
fi
v_m=$(echo $v_max |tr -s " " "\n" |sort -n |tr "\n" " " |awk '{ print $1 " " $NF }')
f_show_max
echo
echo -n "   一共处理了$v_count行。"
f_show_time
echo
exit 0
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
sk1418
帖子: 229
注册时间: 2007-07-01 17:36
系统: (En):System
来自: (En):address
送出感谢: 2 次
接收感谢: 3 次
联系:

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

#12

帖子 sk1418 » 2011-03-12 22:16

fnan 写了:用五十万数字测试, 运行不了, 超过极限。 :em06

kose5@kose5-Aspire-4552:~$ awk '{for(i=2;i<=NF;i++) n[$i]=sqrt($i*$i);} END{l=asort(n,t); max=t[l]; print("maxABS: "max); if(max in n)print "Element: " max; if((0-max) in n) print "Element: "0-max } ' s2.t
awk: line 2: function asort never defined
8 楼的asort 函数怎样才能用啊?
你awk什么版本?3.1以上 有asort, asorti 排序。
---
regards,

Kent
fnan
帖子: 919
注册时间: 2009-07-01 22:04
送出感谢: 0
接收感谢: 13 次

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

#13

帖子 fnan » 2011-03-13 21:26

UBUNTU10.10 awk 不知道是什么版本。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
sk1418
帖子: 229
注册时间: 2007-07-01 17:36
系统: (En):System
来自: (En):address
送出感谢: 2 次
接收感谢: 3 次
联系:

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

#14

帖子 sk1418 » 2011-03-13 22:47

老大,你可以看一下啊!

代码: 全选

ArchT60::/home/kent
kent$ awk -W version                                                                           [ 15:46 ]
[b]GNU Awk 3.1.8[/b]
---
regards,

Kent
fnan
帖子: 919
注册时间: 2009-07-01 22:04
送出感谢: 0
接收感谢: 13 次

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

#15

帖子 fnan » 2011-03-13 23:01

kose3@kose3-desktop:~$ awk -W version
GNU Awk 3.1.6
Copyright (C) 1989, 1991-2007 Free Software Foundation.
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
回复

回到 “Shell脚本”