如何从Linux bash shell脚本的文件中获取最大数量

Ema*_*man 10 bash shell numbers file max

如何从文件中获取最大"速率"和相应的"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
Run Code Online (Sandbox Code Playgroud)

dev*_*ull 14

用途sort:

sort -t= -nr -k3 inputfile | head -1
Run Code Online (Sandbox Code Playgroud)

对于给定的输入,它将返回:

log2c=3.0 rate=89.5039
Run Code Online (Sandbox Code Playgroud)

如果要将值读入变量,可以使用内置函数read:

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


Wil*_*den 6

对于非常大的文件,使用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
Run Code Online (Sandbox Code Playgroud)

该操作的时间复杂度是线性的,而空间复杂度是恒定的(并且很小).说明:

  1. awk -F= '...' test.txt:在test.txt上调用awk,使用=字段分隔符
  2. BEGIN { max = -inf }:初始化max为始终小于您正在阅读的内容.
  3. { if ($3 > max) { max = $3; line = $0; } }:对于每个输入行,if max小于第三个字段($3)的值,然后更新它并记住当前行的值($0)
  4. END { print line }:最后,在读取输入时打印我们记住的行.