使用 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

当我尝试排序命令时

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

您缺少-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-3 组合在一个 KEYDEF 中,例如

$ 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

答案

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

随机IR提供的在每种情况下都是正确的。

下面提到的由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

我推荐第一个选项。

最新更新