请教如何查找最大值?
-
- 帖子: 45
- 注册时间: 2008-03-22 1:19
- 联系:
请教如何查找最大值?
有一文件: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
请问要如何处理?
内容如下:
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
请问要如何处理?
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
- HuntXu
- 帖子: 5776
- 注册时间: 2007-09-29 3:09
Re: 请教如何查找最大值?
代码: 全选
[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
#!/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
- 帖子: 1604
- 注册时间: 2006-10-25 18:08
Re: 请教如何查找最大值?
[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]
#! /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制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
- fanhe
- 帖子: 2357
- 注册时间: 2007-03-24 23:45
Re: 请教如何查找最大值?
代码: 全选
#!/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()
上面能用,自己修改file参数为你的文件,你自己确保文件里面都是数字啊
刚学,但求能搞出结果,不求简洁高效

以上代码,用
代码: 全选
python <有这代码的文件>
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 请教如何查找最大值?
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自己挑了。
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++强悍,不过可以用。
-
- 帖子: 229
- 注册时间: 2007-07-01 17:36
- 系统: (En):System
- 来自: (En):address
- 联系:
Re: 请教如何查找最大值?
awk的
10.1和 -10.1都有的情况输出:
python的
也是正负都有的情况,输出:
代码: 全选
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
代码: 全选
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
regards,
Kent
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 请教如何查找最大值?
最后完成:
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}'
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++强悍,不过可以用。
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 请教如何查找最大值?
用五十万数字测试, 运行不了, 超过极限。
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 函数怎样才能用啊?

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++强悍,不过可以用。
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 请教如何查找最大值?
无限个数字版
通过五十万数字测试:
已处理了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:~$
通过五十万数字测试:
已处理了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++强悍,不过可以用。
-
- 帖子: 229
- 注册时间: 2007-07-01 17:36
- 系统: (En):System
- 来自: (En):address
- 联系:
Re: 请教如何查找最大值?
你awk什么版本?3.1以上 有asort, asorti 排序。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 函数怎样才能用啊?
---
regards,
Kent
regards,
Kent
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
-
- 帖子: 229
- 注册时间: 2007-07-01 17:36
- 系统: (En):System
- 来自: (En):address
- 联系:
Re: 请教如何查找最大值?
---
regards,
Kent
regards,
Kent
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 请教如何查找最大值?
kose3@kose3-desktop:~$ awk -W version
GNU Awk 3.1.6
Copyright (C) 1989, 1991-2007 Free Software Foundation.
GNU Awk 3.1.6
Copyright (C) 1989, 1991-2007 Free Software Foundation.
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。