![排序顺序说明](https://linux22.com/image/60942/%E6%8E%92%E5%BA%8F%E9%A1%BA%E5%BA%8F%E8%AF%B4%E6%98%8E.png)
给了很多文件,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.2n
或sort -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}