排序顺序说明

排序顺序说明

给了很多文件,sort -n给了我这个结果:

f1.txt
f10.txt
f2.txt

这对我来说似乎不对。解释是什么?

我可以默认得到这个吗:

f1.txt
f2.txt
f10.txt

答案1

我建议使用

sort -V data.txt

-V代表“版本排序”,它基本上可以正确处理字母和数字字符,因此,如果您有更多文件,请说:

f1.txt
f10.txt
f2.txt
a1.txt
a10.txt
a2.txt

然后sort -V会给你

a1.txt
a2.txt
a10.txt
f1.txt
f2.txt
f10.txt

sort -k 1.2nsort -n -k 1.2

a1.txt
f1.txt
a2.txt
f2.txt
a10.txt
f10.txt

答案2

因为你的数据线没有开始对于数字,-n单数排序会将它们视为非数字(因此将它们保留在原处)。一旦不再能够将数据解释为数字,它就会-n停止关注。您需要使用-k眼睛排序选项:

sort -k 1.2n data.txt

它使用第一个字段定义的键进行排序,从第二个字符开始,从该点开始使用数字比较。

答案3

GNU 排序-n选项使用strnumcmp()这不做数值转换(参见 numcompare() 函数)。这纯粹是字符串比较。

当您的关键字段不以数字开头时,最后的排序方法将逐字节排序,您将根据您的语言环境获得按字母顺序排列的结果。

例子:

$ LC_ALL=en_US.utf8 sort -n test.txt
f10.txt
f1.txt
f2.txt

$ LC_ALL=C sort -n test.txt
f1.txt
f10.txt
f2.txt

答案4

如果使用zsh,您可以使用以下方法对列表进行数字排序:

printf '%s\n' *.txt(n)

这类似于 GNUsort -v或 GNUls-v排序:

ls -vd -- *.txt

排序f2之前f10,但g1排序之后f2

对存储在数组中的列表进行排序zsh(而不是使用通配符对当前目录中的文件进行排序):

files=(
  f1.txt
  f10.txt
  f2.txt
)
printf '%s\n' ${(n)files}    

相关内容