使用bash排序按多列对文件进行排序

Sam*_*Sam 1 sorting bash

这是我正在使用的文件

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
Run Code Online (Sandbox Code Playgroud)

当我尝试排序命令时

sort -k1,1 -k2,2 -k3,3 file.txt 
Run Code Online (Sandbox Code Playgroud)

我收到以下信息;我不明白为什么第 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
Run Code Online (Sandbox Code Playgroud)

当我尝试将 -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
Run Code Online (Sandbox Code Playgroud)

我想要的结果是

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
Run Code Online (Sandbox Code Playgroud)

ran*_*mir 5

您缺少-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
Run Code Online (Sandbox Code Playgroud)

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


Dav*_*ica 5

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

$ sort -k1,1 -k2,3n file
Run Code Online (Sandbox Code Playgroud)

输出

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
Run Code Online (Sandbox Code Playgroud)