如何按行末尾数字排序?sort -nr命令未达预期问题解决
问题分析与解决方案:按机器名末尾数字降序排序
我懂你遇到的糟心问题了——用sort -nr没得到预期的排序结果,这是因为sort -nr默认会把整个字符串当作数值来处理,但你的机器名是machine-a-xx这种混合字符串,它会按字符逐个比较,而不是单独识别末尾的数字。比如machine-a-8和machine-a-72,字符串比较时会先看machine-a-之后的第一个字符:8比7大,所以machine-a-8会排在machine-a-72前面,这显然不是你想要的。
下面给你几个实用的解决方案,都能实现按末尾数字降序排序:
方法1:指定分隔符与排序字段
用sort的-t指定分隔符,-k指定要排序的字段:
command list -r machine-a-.* | sort -t '-' -k 3,3nr
-t '-':把-作为字段分隔符,这样machine-a-72会被分成3个字段:machine、a、72-k 3,3nr:只针对第3个字段(也就是数字部分)排序,n表示数值排序,r表示降序
方法2:提取数字后排序再还原
如果你的机器名格式有变化,这种方法更灵活:
command list -r machine-a-.* | awk -F '-' '{print $3, $0}' | sort -nr | cut -d ' ' -f2-
awk:先把末尾的数字提取出来放在每行开头,比如把machine-a-72变成72 machine-a-72sort -nr:按开头的数字降序排序cut:把开头的数字去掉,还原成原来的机器名
方法3:版本号排序(最简洁)
sort有个专门的版本号排序选项-V(或--version-sort),完美适配这种带数字的字符串:
command list -r machine-a-.* | sort -Vr
-V:会自动识别字符串中的连续数字,按数值大小排序-r:反转结果,实现降序
用以上任意一种方法,你都会得到正确的排序结果:
machine-a-72、machine-a-71、machine-a-70、machine-a-9、machine-a-8
内容的提问来源于stack exchange,提问作者MIDE11
相关产品推荐
相关产品推荐

