我有这个文件。
$ cat foo.txt
foo 1
foo 12
foo 110
foo 15
foo 120
我想按数字对这个文件进行排序。但是我无法使用 sort -n
命令这样做。
$ sort -n foo.txt
foo 1
foo 110
foo 12
foo 120
foo 15
我期望的输出是这样的。
foo 1
foo 12
foo 15
foo 110
foo 120
我有两个问题。
- 为什么
sort -n
不按数字对文件进行排序?当它找到两行foo 12
和foo 110
时,两者的初始部分foo
相同,因此它会被强制比较12
和110
并确定12
在110
之前,但正如我们在输出中看到的那样,这不是案件。为什么? - 如何在 Unix/Linux 中实现数字排序,即预期的输出。我对非 POSIX 命令和选项持开放态度,但最好能有在 POSIX shell 或系统中运行的东西。
最佳答案
$ sort -nk2 foo.txt
foo 1
foo 12
foo 15
foo 110
foo 120
来自排序手册页:
-k, --key=POS1[,POS2]
start a key at POS1, end it at POS2 (origin 1)
至于对问题第一部分的回答:我不确定(即,我没有发现它被明确提及),但按字段排序,默认分隔符设置为空格。所以默认情况下,它只对第一个字段进行排序,而忽略其他字段。如果您尝试将这两个字段结合起来,例如通过使用 -t
并将其设置为一些未使用的字符 (-t$
),-n
对数字 string 值,它将按字母顺序排列(因为 foo
根本不是数字)。因此,foo 110
仍会出现在 foo 12
之前。
关于linux - 当每行不以数字开头时在 shell 中进行数字排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32177169/