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

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

如何从第 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

答案1

这应该有效:

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 指定要进行排序的第一个字段。

现在,在排序之后,我正在管道输出并刚刚获得第一个结果,这将为我提供结果中第 1 列的数值最高值。

现在,我最终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

答案2

你可以用 来做到这一点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变量。

答案3

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

答案4

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

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

输出:

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

相关内容