同时按字典序和数字大小进行排序

6
我有一个名为tmp.txt的文件(实际上是一个bash命令的输出),其中包含如下条目:
    ...
ammp            0                1.03683
ammp            10               2.69954
ammp            1                1.05712
ammp            11               2.70339
ammp            12               2.70339
ammp            2                1.88586
ammp            3                2.50103
ammp            4                2.64734
ammp            5                2.67462
ammp            6                2.68097
ammp            7                2.68631
ammp            8                 2.6904
ammp            9                2.69517
applu           0               0.678798
applu           10              0.922213
applu           1               0.901234
applu           11              0.923596
applu           12              0.923596
applu           2               0.901657
applu           3               0.903176
applu           4               0.908912
applu           5               0.913879
applu           6               0.914885
applu           7               0.915516
applu           8               0.917368
applu           9               0.920753
apsi            0                1.09037
apsi            10               2.20494
apsi            1                1.16651
apsi            11               2.24381
apsi            12               2.24381
apsi            2                1.49532
apsi            3                1.79137
apsi            4                1.79581
apsi            5                1.79601
apsi            6                1.80062
apsi            7                1.91269
apsi            8                 1.9579
apsi            9                2.00872
    ...

我想按照第一个字段和第二个字段进行排序。 问题在于我想对第一个字段进行字典排序,对第二个字段进行数字排序。
我尝试了以下方法:
cat tmp.txt | sort -k1,2

将两个字段按字典顺序排序
cat tmp.txt | sort -k1 | sort -n -k2

这句话的意思不太清楚,可能需要更多的上下文才能正确翻译。可以提供更多信息吗?
cat tmp.txt | sort -s -k1.2n

据说这是一种稳定的排序方法,可以按第二个字段的数字进行排序。但实际上并不起作用,而是按字典顺序对第二个字段进行排序...
有什么想法吗?
1个回答

9

尝试:

sort -k 1,1 -k 2,2n file

这将按照第一个字段的字母顺序进行排序,然后按照第二个字段的数字进行排序。

sort man 页面提供了一些示例。


4
那个 man 手册使用了你在示例中描述的排序形式,但在 -k 选项的描述中并没有明确说明它是有效的。GNU coreutils 的 man 手册info 页面 明确指出了 "-k" 的选项参数可以包括像 n 这样的选项。 - user743382
我的Ubuntu 11.04的手册页没有任何示例。不过这个解决方案确实有效。 - vkontori

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接