当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 34 篇帖子 ]  前往页数 1, 2, 3  下一页
作者 内容
1 楼 
 文章标题 : 请教如何查找最大值?
帖子发表于 : 2011-03-11 3:07 

注册: 2008-03-22 1:19
帖子: 45
送出感谢: 0 次
接收感谢: 0 次
有一文件: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
请问要如何处理?


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 请教如何查找最大值?
帖子发表于 : 2011-03-11 5:32 

注册: 2009-07-01 22:04
帖子: 919
送出感谢: 0 次
接收感谢: 13
真的不知道如何取负数的绝对值?


_________________
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 请教如何查找最大值?
帖子发表于 : 2011-03-11 7:34 
头像

注册: 2007-09-29 3:09
帖子: 5777
送出感谢: 0 次
接收感谢: 5
代码:
[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...


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 请教如何查找最大值?
帖子发表于 : 2011-03-11 13:11 
头像

注册: 2006-10-25 18:08
帖子: 1582
送出感谢: 0 次
接收感谢: 0 次
[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制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 请教如何查找最大值?
帖子发表于 : 2011-03-11 20:01 

注册: 2009-07-01 22:04
帖子: 919
送出感谢: 0 次
接收感谢: 13
如果有-10.1 10.1随便选一个吗?


_________________
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 请教如何查找最大值?
帖子发表于 : 2011-03-11 22:57 
头像

注册: 2007-03-24 23:45
帖子: 2357
送出感谢: 0 次
接收感谢: 9
代码:
#!/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 <有这代码的文件>

运行


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 请教如何查找最大值?
帖子发表于 : 2011-03-11 23:58 

注册: 2009-07-01 22:04
帖子: 919
送出感谢: 0 次
接收感谢: 13
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++强悍,不过可以用。


页首
 用户资料  
 
8 楼 
 文章标题 : Re: 请教如何查找最大值?
帖子发表于 : 2011-03-12 6:20 

注册: 2007-07-01 17:36
帖子: 229
地址: (En):address
系统: (En):System
送出感谢: 2
接收感谢: 3
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


页首
 用户资料  
 
9 楼 
 文章标题 : Re: 请教如何查找最大值?
帖子发表于 : 2011-03-12 7:39 

注册: 2009-07-01 22:04
帖子: 919
送出感谢: 0 次
接收感谢: 13
最后完成:
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++强悍,不过可以用。


页首
 用户资料  
 
10 楼 
 文章标题 : Re: 请教如何查找最大值?
帖子发表于 : 2011-03-12 10:04 

注册: 2009-07-01 22:04
帖子: 919
送出感谢: 0 次
接收感谢: 13
用五十万数字测试, 运行不了, 超过极限。 :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++强悍,不过可以用。


页首
 用户资料  
 
11 楼 
 文章标题 : Re: 请教如何查找最大值?
帖子发表于 : 2011-03-12 19:41 

注册: 2009-07-01 22:04
帖子: 919
送出感谢: 0 次
接收感谢: 13
无限个数字版
通过五十万数字测试:
已处理了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++强悍,不过可以用。


页首
 用户资料  
 
12 楼 
 文章标题 : Re: 请教如何查找最大值?
帖子发表于 : 2011-03-12 22:16 

注册: 2007-07-01 17:36
帖子: 229
地址: (En):address
系统: (En):System
送出感谢: 2
接收感谢: 3
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


页首
 用户资料  
 
13 楼 
 文章标题 : Re: 请教如何查找最大值?
帖子发表于 : 2011-03-13 21:26 

注册: 2009-07-01 22:04
帖子: 919
送出感谢: 0 次
接收感谢: 13
UBUNTU10.10 awk 不知道是什么版本。


_________________
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。


页首
 用户资料  
 
14 楼 
 文章标题 : Re: 请教如何查找最大值?
帖子发表于 : 2011-03-13 22:47 

注册: 2007-07-01 17:36
帖子: 229
地址: (En):address
系统: (En):System
送出感谢: 2
接收感谢: 3
老大,你可以看一下啊!


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


_________________
---
regards,

Kent


页首
 用户资料  
 
15 楼 
 文章标题 : Re: 请教如何查找最大值?
帖子发表于 : 2011-03-13 23:01 

注册: 2009-07-01 22:04
帖子: 919
送出感谢: 0 次
接收感谢: 13
kose3@kose3-desktop:~$ awk -W version
GNU Awk 3.1.6
Copyright (C) 1989, 1991-2007 Free Software Foundation.


_________________
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 34 篇帖子 ]  前往页数 1, 2, 3  下一页

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译