You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现小写优先于大写的排序?附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

原理说明:

  1. awk预处理:把每个目录名转换成小写作为第一排序键,同时给小写开头的条目加0、大写开头的加1作为第二排序键;
  2. sort排序:先按小写名称排序(保证dir1、dir2、dir3/Dir3的顺序),再按第二键升序排列(0在前,1在后,所以小写的dir3会排在Dir3前面);
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 16:48:13