bash sort命令字符串排序不符合预期的原因及调整方法
bash sort命令字符串排序不符合预期的原因及调整方法
嗨,这个问题我之前也踩过坑!其实bash里的sort命令和你默认想的逐字符ASCII排序逻辑不一样,核心原因是它跟着系统的**区域设置(locale)**走,这就是为啥结果和你预期的、和Python默认排序不一样的根源!
先给你拆解为啥会出现这个反直觉的结果:
咱们系统默认的locale(比如en_US.UTF-8这类)里,sort用的是LC_COLLATE环境变量定义的排序规则——这种规则会把标点符号当成「次要字符」,排序时会优先比较字母部分,甚至会跳过标点先比有效字母。比如你测试的b.de和bb.de:
- 默认locale下,
sort会自动忽略.的存在,把b.de等价成bde,bb.de等价成bbde; - 这时候比较
bde和bbde,自然bbde会排在bde前面,就出现了你看到的bb.de在前、b.de在后的结果。
而Python的默认排序是严格按每个字符的Unicode编码值逐字符比较,.的编码值本来就比b小,所以会按你预期的逻辑排序。
那怎么改成你想要的「逐字符严格比较」的行为呢?很简单,只要让sort按ASCII编码规则排序就行,有两种常用方法:
- 方法一:临时设置环境变量
LC_COLLATE为C,执行排序命令:
如果你是直接在终端输入内容排序,也可以这么用:LC_COLLATE=C sort your_input_file.txt
执行后输出就是你预期的:cat << EOF | LC_COLLATE=C sort b.de bb.de EOF
这种方式会让b.de bb.desort严格按照每个字符的ASCII码值逐字符比较,和Python的默认排序逻辑完全一致,你的第一个测试案例也会保持正确的顺序。 - 方法二:如果只是单次排序,也可以尝试
sort的--collation-order=C参数(不过部分旧版本的sort可能不支持,还是用方法一更保险)。
备注:内容来源于stack exchange,提问作者Zulakis
相关产品推荐
相关产品推荐

