如何从第 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
变量设置max
为0
,然后,对于每一行,第一个字段与 的当前值进行比较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