使用bash排序按多列排序文件

时间:2017-07-11 18:52:45

标签: bash sorting

这是我正在使用的文件

word01.2    10  25
word01.2    30  50
word01.1    10  30
word01.1    40  50
word01.2    40  50
word01.1    10  20
word01.1    5   8

当我尝试我的排序命令时

sort -k1,1 -k2,2 -k3,3 file.txt 

我收到以下内容;我不明白为什么第2行和第1行没有排序,它们应该处于反向位置

word01.1    10  30
word01.1    10  20
word01.1    40  50
word01.1    5   8
word01.2    10  25
word01.2    30  50
word01.2    40  50

当我尝试将-g添加到排序时,排序的文件有更多问题,第1列不再排序

sort -k1,1 -gk2,2 -gk3,3 file.txt 
word01.1    5   8
word01.1    10  20
word01.2    10  25
word01.1    10  30
word01.2    30  50
word01.1    40  50
word01.2    40  50

我想要的结果是

word01.1    5   8
word01.1    10  20
word01.1    10  30
word01.1    40  50
word01.2    10  25
word01.2    30  50
word01.2    40  50

3 个答案:

答案 0 :(得分:4)

您还可以在一个KEYDEF中组合字段2-3,例如

$ sort -k1,1 -k2,3n file

<强>输出

word01.1    5   8
word01.1    10  20
word01.1    10  30
word01.1    40  50
word01.2    10  25
word01.2    30  50
word01.2    40  50

答案 1 :(得分:3)

您错过了-n/--numeric-sort选项,根据字符串数值排序,而不是按字典顺序排序(至少对于第二和第三字段):

$ sort -k1,1 -k2,2n -k3,3n file.txt
word01.1    5   8
word01.1    10  20
word01.1    10  30
word01.1    40  50
word01.2    10  25
word01.2    30  50
word01.2    40  50

请注意,您可以提供全局-n标记,将所有字段排序为数值或按键。密钥格式为-k KEYDEF,其中KEYDEFF[.C][OPTS][,F[.C][OPTS]]OPTS排序选项中的一个或多个,如n(数字),r(反向),g(通用数字),h(人类数字)等。

答案 2 :(得分:1)

答案

 $ sort -k1,1 -k2,2n -k3,3n file.txt

在每种情况下,randomir提供的都是正确的。

下面提到的是David C粘贴的组合选项。由于Randin仅比​​较第三列中的第一位,因此无法正常工作。

$ sort -k1,1 -k2,3n file

即下面粘贴的文件将无法正确排序:

word01.2    10  25
word01.2    30  50
word01.1    10  30
word01.1    40  50
word01.2    40  50
word01.1    10  20
word01.1    5   8
word01.1    410  50
word01.1    45  120
word01.1    45  100
word01.1    45  1000
word01.1    40  6

我建议第一个选择。