我想根据文件名中的数字对文件进行排序。以下是文件:
$ 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:~#