Linux 当每行不以数字开头时,在shell中进行数字排序

Linux 当每行不以数字开头时,在shell中进行数字排序,linux,shell,posix,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 我有两个问题 为什么排序-n不对文件进行数字排序?当它找到两行foo 12和foo 110时,初始部分fo

我有这个档案

$ 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
我有两个问题

  • 为什么
    排序-n
    不对文件进行数字排序?当它找到两行
    foo 12
    foo 110
    时,初始部分
    foo
    在这两行中是相同的,因此它将被迫对
    12
    110
    进行数字比较,并确定
    12
    110
    之前,但正如我们在输出中看到的,情况并非如此。为什么?
  • 如何在Unix/Linux中实现数字排序,即预期输出。我对非POSIX命令和选项持开放态度,但最好能在POSIX shell或系统中运行
  • 从排序手册页:

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

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

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