当每行不以数字开头时 shell 中的数字排序

Numerical sort in shell when each line does not begin with number

我有这个文件。

$ 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

我有两个问题。

  1. 为什么 sort -n 不按数字对文件进行排序?当它找到两行 foo 12foo 110 时,两者的初始部分 foo 相同,因此它会被迫比较 12110 的数字和决定 12110 之前,但正如我们在输出中看到的那样,情况并非如此。为什么?
  2. 如何在 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.

之前