我一直以为,sort
如果不使用任何附加参数,文件将按字典顺序排序。然而今天我遇到了以下测试用例:
sort test2.txt
a/a
a/c
a//c
a/d
如您所见,第三行有两个斜线,因此第二个斜线位于相邻行分别有字母“c”和“d”的位置。我怀疑在任何代码页中“/”都不会出现在“c”和“d”之间,所以我猜想默认比较算法不是严格的词汇比较算法。
是否有一些预处理(例如删除非字母?)或特殊情况(例如“一个或多个符号的序列等于任何其他符号序列”?)用于比较符号?
我已经阅读了man
页面sort
,但没有找到任何启发。
我用
sort --version
sort (GNU coreutils) 8.5
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Mike Haertel and Paul Eggert.
我确实需要对数百万个 URL 进行排序以进行进一步分析,这假设词汇排序 - 有没有什么选项可以传递来sort
实现这一点?
答案1
这是您的语言环境,请在排序命令前加上语言环境设置,以指定所需的排序顺序
$ cat test2.txt
a/d
a/a
a/c
a//c
$ sort test2.txt
a/a
a/c
a//c
a/d
$ LANG=C sort test2.txt
a//c
a/a
a/c
a/d
man sort
说
*** WARNING *** The locale specified by the environment affects sort
order. Set LC_ALL=C to get the traditional sort order that uses native
byte values.
GNU说
大多数语言特定的区域设置都有指定忽略标点符号和折叠大小写的排序行为的表格。这对于大多数长期使用计算机的用户来说是违反直觉的!
笔记
如果你的数百万个 URL 包含任何非 ASCII 字符(这将使它们实际上免疫学抑制剂)使用字节值排序可能会得到不想要的结果。您可以使用URL 编码以避免出现此问题,但 URL 可能会难以被人类阅读。