找到第1列的最大值,并从文件中打印第2列的相应记录


19

如何从第1列中找到最大值,以及如何从包含n个记录的文件中回显相应的路径位置。

$ cat version.log
112030  /opt/oracle/app/oracle/product/11.2.0
121010  /opt/oracle/app/oracle/product/12.1.0

预期产量:

/opt/oracle/app/oracle/product/12.1.0

Answers:


23

这应该工作:

awk -v max=0 '{if($1>max){want=$2; max=$1}}END{print want} ' version.log

-v max=0将变量max0,那么,对于每一行,第一场进行比较的电流值max。如果更大,max则设置为第一字段的值,并want设置为当前行。程序处理完整个文件后,将want打印的当前值。

编辑

我没有awk较早地测试该解决方案,提供它确实对我不利。无论如何,答案的编辑版本应该可以工作(感谢terdon的修复),我也测试了以下内容。

sort -nrk1,1 filename | head -1 | cut -d ' ' -f3

sort在第一个领域

  • -n指定数字排序。
  • -r指定反转排序结果。
  • -k1,1指定要进行排序的第一个字段。

现在,在排序之后,我将对输出进行管道传递,并获得第一个结果,这将使我在结果中的column1的数值达到最大值。

现在,我终于将其cut与指定为空格的定界符进行管道连接,并打印-f3出预期的输出。

测试中

cat filename
112030   /opt/oracle/app/oracle/product/11.2.0
121010   /opt/oracle/app/oracle/product/12.1.0
2312     /hello/some/other/path
3423232  /this/is/really/big/number
342      /ok/not/the/maximum/number
9999899  /Max/number
9767     /average/number

现在,在对上述输入运行上面的命令之后,我得到的输出为,

/Max/number

awk max不会在数字上比较字符串字段。这就是为什么您提供第二种方法?
Sajuuk

7

您可以使用AWK

$ awk '{if(max<$1){max=$1;line=$2}}END{print line}' file 
/opt/oracle/app/oracle/product/12.1.0

在此,将每行的第一列与变量max(最初为0)进行比较。如果第一列的值大于该值,max那么第二列将存储在变量中line,这对于文件的每一行都将继续。

在文件末尾END执行规则以打印line变量。


4
awk '$1 > max { max = $1; output = $2 } END { print output }' version.log

3

sort -k1 -n filename | tail -1 | awk '{print $2}'


1
这应该可行,但效率不高,因为当任务是寻找最大值时,排序是过大的。
jw013 2014年

2

只需使用sort命令即可对其进行排序

sort -r version.log | head -n1 | awk '{print $2}'

输出:

/opt/oracle/app/oracle/product/12.1.0

您想要打印第二个值,请仅尝试使用此cat版本。排序-r | 头-n1 | awk -F“”'{Print $ 2}'
Security Beast

请不要发布您终端的屏幕截图。只需粘贴文本即可。另外,不需要cat,sort可以直接获取输入文件。
terdon

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.