分页: 1 / 3

请教如何查找最大值?

发表于 : 2011-03-11 3:07
coldweb
有一文件: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
请问要如何处理?

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

发表于 : 2011-03-11 5:32
fnan
真的不知道如何取负数的绝对值?

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

发表于 : 2011-03-11 7:34
HuntXu

代码: 全选

[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]

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

发表于 : 2011-03-11 13:11
trigger
[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]

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

发表于 : 2011-03-11 20:01
fnan
如果有-10.1 10.1随便选一个吗?

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

发表于 : 2011-03-11 22:57
fanhe

代码: 全选

#!/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 <有这代码的文件>
运行

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

发表于 : 2011-03-11 23:58
fnan
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自己挑了。

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

发表于 : 2011-03-12 6:20
sk1418
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

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

发表于 : 2011-03-12 7:39
fnan
最后完成:
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}'

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

发表于 : 2011-03-12 10:04
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 函数怎样才能用啊?

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

发表于 : 2011-03-12 19:41
fnan
无限个数字版
通过五十万数字测试:
已处理了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

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

发表于 : 2011-03-12 22:16
sk1418
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 排序。

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

发表于 : 2011-03-13 21:26
fnan
UBUNTU10.10 awk 不知道是什么版本。

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

发表于 : 2011-03-13 22:47
sk1418
老大,你可以看一下啊!

代码: 全选

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

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

发表于 : 2011-03-13 23:01
fnan
kose3@kose3-desktop:~$ awk -W version
GNU Awk 3.1.6
Copyright (C) 1989, 1991-2007 Free Software Foundation.