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

标签 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 并确定 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 之前。

关于linux - 当每行不以数字开头时在 shell 中进行数字排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32177169/

相关文章:

python - crontab 中的延迟作业

linux - 自动重新创建许多不同的链接到重命名的目录或文件

bash - 用一行删除所有损坏的符号链接(symbolic link)?

bash - 登录SSH后执行一条语句

c - recv() 的原型(prototype)

c - 在C中制作自己的shell

sql-server - 如何让 sqlcmd 在 linux 上拥有文件访问权限?

linux - postfix 虚拟文件中模式的问题

c++ - 为什么我的析构函数仅在其父析构函数调用后才使我的代码崩溃?

c - 有没有办法刷新 POSIX 套接字?