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

时间:2015-08-24 07:59:51

标签: linux shell posix

我有这个档案。

$ 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决定12出现在110之前,但正如我们在输出中看到的那样,情况并非如此。为什么?
  2. 如何在Unix / Linux中实现数字排序,即预期输出。我对非POSIX命令和选项持开放态度,但它最适合在POSIX shell或系统中运行。

1 个答案:

答案 0 :(得分:2)

$ sort -nk2 foo.txt
foo 1
foo 12
foo 15
foo 110
foo 120

从排序手册页:

  

-k, - key = POS1 [,POS2]
  在POS1开始一个键,在POS2(原点1)结束

至于问题第一部分的答案:我不确定(即,我没有明确提到它),但是按字段排序,默认分隔符设置为空格。因此,默认情况下,它仅对第一个字段进行排序,并忽略其他字段。如果您尝试组合两个字段,例如通过使用-t并将其设置为某个未使用的字符(-t$),-n对数字字符串值进行排序,这将按字母顺序排列(从{{{ 1}}根本不是数字)。因此,foo仍然会出现foo 110