首页 > 解决方案 > 按 bash 中的所有字段进行数字排序

问题描述

我有一个文件,其中有多个数字,每行用逗号分隔:

1,13,2,5
1,3
2,3,24
1,13,2,6

这只是一个小示例文件。在真实文件中,每一行可能有数百个数字。

这些如何按字段进行数字排序?结果应该是:

1,3
1,13,2,5
1,13,2,6
2,3,24

我试过sort -n -t,了,但是将行作为数字进行比较,产生了错误的结果。

标签: bashsorting

解决方案


这实际上是一个非常微妙的问题,与sort处理数字字段的方式有关。结果是您需要明确告诉sort对每个关键字段进行数字排序:

sort -t, -k1,1n -k2,2n -k3,3n -k4,4n

如果你不这样做,infoGNU 的部分会sort稍微解释一下,

sort将使用从 [first] 字段开始并延伸到行尾的所有字符作为主数字键。对于大多数应用程序,将跨越多个字段的键视为数字不会达到您的预期。

它巧妙地总结了你所看到的!

显然,显式指定键会使sort在每行具有任意长数字列表的文件上使用不方便。作为 hack,您可以尝试使用 GNUsort的版本排序选项,-V.

sort -V

这似乎对您的特定数据做了正确的事情。我已经sort -V在 600 个数字的行上进行了测试,它工作正常。


推荐阅读