如何在Linux Bash Shell脚本中从文件中获取最大数

12

如何从以下文件中获取最大的“rate”和相应的“log2c”值?例如:最大速率为89.5039,log2c为3.0。非常感谢。

log2c=5.0 rate=88.7619
log2c=-1.0 rate=86.5412
log2c=11.0 rate=86.1482
log2c=3.0 rate=89.5039
log2c=-3.0 rate=85.5614
log2c=9.0 rate=81.4302

1
你为什么不用Awk来做这个?只需要简短的入门教程后,这应该是非常容易的。 - tripleee
devnull的解决方案在bash中完美运行。然而,我的输入文件名来自变量$filename。因此,我将这些单词放入echo“...”| sh中。请原谅我,我是一个新手。 - Eman
2个回答

17

使用 sort

sort -t= -nr -k3 inputfile | head -1

对于给定的输入,它将返回:
log2c=3.0 rate=89.5039

如果您想将值读入变量中,可以使用内置的read函数:

$ IFS=$' =' read -a var <<< $(sort -t= -nr -k3 inputfile | head -1)
$ echo ${var[1]}
3.0
$ echo ${var[3]}
89.5039

或者 IFS=$' =' read unused log2c unused rate <<< "$(sort -t= -nr -k3 inputfile | head -1)" - anishsane
@anishsane 当你使用read读取一行时,不再需要使用head。 - konsolebox
哦,是的,没错...我懒得改$(...)的内容。 - anishsane
感谢您。以下内容可用:filename="${prefix}.txt"
IFS=$' =' read -a var <<< $(sort -t= -nr -k5 $filename | head -1)
c=${var[1]}
g=${var[3]}
maxrate=${var[5]}
echo "c=$c"
echo "g=$g"
echo "maxrate=$maxrate"
- Eman

8

对于非常大的文件,使用sort会非常慢。在这种情况下,最好使用像awk这样只需要一次遍历的工具:

$ awk -F= 'BEGIN { max = -inf } { if ($3 > max) { max = $3; line = $0 } } END { print line }' test.txt
log2c=3.0 rate=89.5039

这个操作的时间复杂度是线性的,而空间复杂度是恒定的(并且很小)。解释如下:
  1. awk -F= '...' test.txt:在test.txt上调用awk,使用=作为字段分隔符。
  2. BEGIN { max = -inf }:将max初始化为一个始终比你要读取的任何值都要小的值。
  3. { if ($3 > max) { max = $3; line = $0; } }:对于每个输入行,如果max小于第三个字段的值($3),则更新它并记住当前行的值($0)。
  4. END { print line }:最后,打印我们在读取输入时记住的行。

除非您将“print line”替换为“print $line”,否则它在我的Linux和Max上使用gawk 4.1.4时无法正常工作。 - Daniel Pinyol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接