为什么非数字记录排序时显示在“0”之后?

为什么非数字记录排序时显示在“0”之后?

我想根据文件名中的数字对文件进行排序。以下是文件:

$ ls *.f
0.f  13.f  1.f  22.f  4.f  abc.f

排序结果:

$ ls *.f | sort -t. -k1n
0.f
abc.f # note this file!
1.f
4.f
13.f
22.f

我所期望的是:

$ ls *.f | sort -t. -k1n
abc.f
0.f
1.f
4.f
13.f
22.f

为什么abc.f只在0.f之前和之后显示1.f?是因为0不被视为数字吗sort?我在网上搜索并没有找到任何参考。

答案1

原因是因为使用数字排序时,没有数字的字符串将被视为零。 GNU sort 的行为是正确的,但没有说明原因。 Illumos for SunOS sort 的手册页确实提供了解释:

-n
将排序键限制为初始数字字符串,由可选的空白字符、可选的减号以及零个或多个数字以及可选的基数字符和千位分隔符(如当前语言环境中定义)组成,按算术值排序。 空数字字符串被视为零。前导零和零上的符号不影响排序。

SUSv4 和 POSIX.1-2008 中也指定了此行为(http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html),使用与 illumos 手册页相同的措辞。

GNU 排序还有-g“通用数字排序”,它按浮点数而不是整数排序,其中空数字字符串在零之前排序。我不确定这是副作用还是故意的。然而,-g它带有一个警告,因为它比-n.如果您正在对大型数据集进行排序或执行用户正在等待的任何操作,则应该避免-g

答案2

你可以使用-g

-g, --general-numeric-sort 按照通用数值进行比较

root@virt01-ubuntu:~# ls  | sort -t. -k1g
a.txt
0.txt
1.txt
2.txt
3.txt
root@virt01-ubuntu:~#

相关内容