如何实现小写优先于大写的排序?附sort命令示例需求
实现小写优先于大写的排序方案
要解决这个问题,我们需要让sort命令在忽略大小写排序的基础上,把小写开头的目录名优先排在大写开头的同名目录前面。这里有两种实用的方法:
方法一:用awk预处理生成排序键(通用可靠)
这种方法通过给每个条目添加额外的排序标记,确保小写条目在同名大写条目之前,不受系统locale的影响,兼容性最好。
执行以下命令:
echo -e "Dir3\ndir1\ndir2\ndir3" | awk '{ lower_name = tolower($0) # 给小写开头的条目标记0,大写开头的标记1 priority = ($0 ~ /^[a-z]/) ? 0 : 1 print lower_name "\t" priority "\t" $0 }' | sort -k1,1 -k2,2n | cut -f3
原理说明:
- awk预处理:把每个目录名转换成小写作为第一排序键,同时给小写开头的条目加
0、大写开头的加1作为第二排序键; - sort排序:先按小写名称排序(保证dir1、dir2、dir3/Dir3的顺序),再按第二键升序排列(0在前,1在后,所以小写的dir3会排在Dir3前面);
- cut提取结果:去掉前面的排序键,只保留原始目录名。
输出结果就是你想要的:
dir1 dir2 dir3 Dir3
方法二:利用ASCII值特性调整排序规则
如果你的系统支持,也可以通过组合sort的参数实现。因为小写字母的ASCII值(97-122)比大写字母(65-90)大,我们可以先按忽略大小写的顺序排序,再对相同名称的条目按ASCII值降序排列(让小写的排在前面):
echo -e "Dir3\ndir1\ndir2\ndir3" | sort -f --key=1,1 --key=1,1nr -s
原理说明:
-f:忽略大小写进行基础排序;--key=1,1 --key=1,1nr:先按忽略大小写的名称排序,再对相同名称的条目按原始字符的ASCII值降序排列;-s:启用稳定排序,确保相同排序键的条目保持相对顺序(这里主要是保证降序规则生效)。
不过这种方法可能受系统locale的影响,不如方法一通用。
内容的提问来源于stack exchange,提问作者Pyo
相关产品推荐
相关产品推荐

