Sorting 不带-n标志的命令行排序
我试图理解当要排序的文件的每一行的第一个字符都是数字时,如果使用Sorting 不带-n标志的命令行排序,sorting,command-line,Sorting,Command Line,我试图理解当要排序的文件的每一行的第一个字符都是数字时,如果使用sort命令而不使用-n标志,会发生什么情况。当我跑的时候 du /bin/* | sort 看起来输出将所有以相同数字开头的行组合在一起,并在每个组中进行排序,但这些数字没有排序。下面是一个示例性的输出片段 44 /bin/lsblk 44 /bin/ntfswipe 44 /bin/ping 44 /bin/ping6 44 /bin/rmdir 48 /bin/cat 48 /bin/ed 48 /bin/l
sort
命令而不使用-n
标志,会发生什么情况。当我跑的时候
du /bin/* | sort
看起来输出将所有以相同数字开头的行组合在一起,并在每个组中进行排序,但这些数字没有排序。下面是一个示例性的输出片段
44 /bin/lsblk
44 /bin/ntfswipe
44 /bin/ping
44 /bin/ping6
44 /bin/rmdir
48 /bin/cat
48 /bin/ed
48 /bin/login
4 /bin/bzdiff
4 /bin/bzgrep
4 /bin/bzmore
4 /bin/gunzip
4 /bin/red
4 /bin/running-in-container
4 /bin/unicode_start
4 /bin/which
4 /bin/zcat
4 /bin/zcmp
4 /bin/zegrep
4 /bin/zfgrep
4 /bin/zforce
4 /bin/zless
4 /bin/zmore
非数字排序是按区域设置指定的顺序逐字符排序。最容易描述这一点的语言环境是
C
,它按ASCII顺序进行排序;如果您位于不同的区域设置中,则空格可以在数字之前或之后排序,具体取决于其排序顺序的定义。(只有非常奇怪的区域设置才不会按常规顺序对字符0
到9
进行排序,但实际上可以定义区域设置来实现这一点!)
但是,对于C
locale,空格字符的ASCII值为32,而数字0到9的ASCII值为48到57。因此,5
在49
之后排序,但在60
之前排序
如果这不合理,请使用排序顺序更自然的其他内容替换字符。例如,让我们调用空格
a
,通过9
调用0
作为B
通过K
。然后,49
变成DK
,5
变成EA
,60
变成GB
。通常认为DK
在EA
之前,而EA又在GB
之前,这取决于排序顺序,这取决于您的区域设置。获得规范答案的最简单方法是将您的问题定义为仅适用于环境中的LC_ALL=C
。我建议改为LC_COLLATE=C
,这样就不会弄乱终端的字符编码。