仅在特定行 bash 脚本中查找最大值

Find maximum value on only specific lines bash script

我有以下文字:

title
P1 : I = -20.32;
P2 : I = 24.07;
P3 : I = -16.68;
T_B1 : I = 24.93;
T_H1 : I = -7.49;
T_B2 : I = 25.48;
T_H2 : I = -0.20;
T_B3 : I = 25.81;
T_H3 : I = 5.32;
T_B4 : I = 26.00;
T_H4 : I = 9.27;
T_B5 : I = 26.09;
T_H5 : I = 11.84;
T_B5 : I = 26.11;
T_H5 : I = 11.04;

我只想要 T_H*

的最大值
T_H5 : I = 11.84;

我试过这样的方法:

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

我不明白我是否必须使用 sort 或 awk,因为我只想对特定行进行排序。 我多次尝试 google 它并阅读了排序命令手册,但我没有得到我想要的。 如果有人能帮我这个,那就太好了:)谢谢

如果您想使用 UNIX 工具解决这个问题,那么您应该使用一个工具用于每个目的的 UNIX 方法。

grep '^T_H' < input | # Filter
    sort -t= -nr -k3 | # sort
    head -n1

当然还有其他方法可以用更少的管道解决它,但这似乎不是你想要的。

两者都可以,但 Awk 可以更加高效和简洁。

awk '/^T_H[0-9]/ { x = 0 + substr(, 4)
    if (maxx < x) maxx = x }
  END { print 0+maxx }' text

主体提取T_H后的整数并记录当前最大值。 0 + 强制转换为数字,这也会丢弃任何非数字后缀。 END 块中的 0 + 类似地提供了一个数字上下文,因此如果 maxx 由于某种原因为空,则输出将是一个数字而不是空字符串。

如果你指的是最后一个字段的最大值而不是T_H之后的数字,那就更容易了;只需使用 $NF 而不是 substr(...) 表达式。

如果要打印整行,请将其保存在第二个变量中,并在更新最大值时更新它。

awk '/^T_H[0-9]/ { x = 0 + $NF
    if (maxx < x) { res = [=11=]; maxx = x } }
  END { print res }' text

(这也说明了 $NF 变体。)

另一个awk脚本,获取T_H*的最大值:

awk '/^T_H/{max=(+0>max?+0:max)}END{print max}' file
11.84

+0 允许删除 ; 以仅获取值。
该值与三元运算符中的 max 变量进行比较。
当到达文件末尾时,打印最大值。