分页: 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参数为你的文件,你自己确保文件里面都是数字啊
刚学,但求能搞出结果,不求简洁高效
以上代码,用
运行
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()
也是正负都有的情况,输出:
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
用五十万数字测试, 运行不了, 超过极限。
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 写了:用五十万数字测试, 运行不了, 超过极限。
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.