繁体   English   中英

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

[英]Sorting a file by multiple columns using bash sort

这是我正在使用的文件

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

您也可以在一个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

您没有使用-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 (人类数字)等。

回答

 $ 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

我建议第一个选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM