如何按字母顺序对主列进行排序,然后按数字顺序对次要列进行排序?

5

Assuming there is a text file:

10  A   QAZ
5   A   EDC
14  B   RFV
3   A   WSX
7   B   TGB

我希望用第二列进行字母顺序排序,用第一列进行数值顺序排序。以下是期望的结果:

3   A   WSX
5   A   EDC
10  A   QAZ
7   B   TGB
14  B   RFV

我尝试了sort -k 2,2 -k 1,1 a.txt -nsort -k 2,2 -k 1,1 a.txt,但两者都给出了错误的结果。我该如何解决这个问题?谢谢。
2个回答

9

这应该可以工作:

sort -b -k2,2 -k1,1n

-b选项是必需的,如果没有该选项,输出结果会有误。因为sort会错误地确定第二列的位置。请参阅man sort(或此处)了解更多细节。

另外,请检查您的locale设置。它们可能会影响sort的工作方式。


3
第二个字段说明符是不必要的。 sort -b -k2 -k1n 应该可以工作。 - William Pursell
1
-b 是我自己(已删除的)答案中缺失的部分。似乎 sort 将两个字段之间存在的最小空格量视为分隔符,给定行中的任何额外空格都分配给第二个字段。 - chepner
@WilliamPursell:不完全是这样。请检查 echo $'3 A WSX\n14 B RFV\n2 A ZZZ' - choroba
看起来-k2,2 -k1n可以工作。 (也许有人可以澄清如果您仅使用-k指定第一个字段,则默认值是什么。) - chepner
1
@chepner:链接的 man 页面已经说明了:这是行末。一旦您开始在第二列中获得数字,您可能还需要 k1,1。 - choroba
显示剩余2条评论

0

这可能适合你:

sort -k1.5,1.8 -k1.1,1.4n file

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