仅在特定行 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
变量进行比较。
当到达文件末尾时,打印最大值。
我有以下文字:
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
变量进行比较。
当到达文件末尾时,打印最大值。