使用Unix排序对多个键进行排序 - Bug?

时间:2017-11-23 12:23:35

标签: linux sorting unix

我尝试使用unix排序按多个键对数据进行排序。我认为我得到了错误的结果。我的命令是

sort -t "_" -k4,4 -k2 -k1,1g  < stdev.txt

结果:

0.322_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap2.dat    0.000110687417806       0.0346076270248
0.3_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap2.dat      0.000111161259827       0.0358869210331
0.321_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap2.dat    0.000134981044857       0.0457899948612
0.332_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap2.dat    2.79712100925e-05       0.0049473335673
0.313_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap2.dat    3.11625097814e-05       0.00588538959351
0.312_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap2.dat    3.69066495111e-05       0.00819208397496
0.331_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap2.dat    3.69774104969e-05       0.00824956236819
0.311_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap2.dat    6.15395637079e-05       0.0173808578728
0.321_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap4.dat    0.000138353320007       1.05986015585
0.322_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap4.dat    0.00017460061705        0.521775402243
0.311_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap4.dat    0.000206502239096       0.149912367819
0.3_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap4.dat      0.000237775594814       0.633350656766
0.332_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap4.dat    3.1779126554e-05        0.0128586399133
0.313_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap4.dat    4.33297503265e-05       0.0166438194725
0.312_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap4.dat    7.21521358641e-05       0.0342760190842
0.331_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap4.dat    7.52883193115e-05       0.0416052108611
...
0.3_rsrc:8_phi:0.5_abr:2_prof:plaw_diff:point.dat       0.000124446390455       0.00132402479772
0.3_rsrc:8_phi:0.5_abr:2_prof:unif_diff:lap2.dat        1.2638050496e-05        0.0289450596111
0.3_rsrc:8_phi:0.5_abr:2_prof:unif_diff:lap4.dat        0.000100909900236       0.170116521056
0.3_rsrc:8_phi:0.5_abr:2_prof:unif_diff:point.dat       0.000237686616486       0.00142895807647
  • 正确读取第一个密钥(所有abr:2都在最后)。
  • 第二个键也正确读取(diff:lap2 s在diff:lap4之前。)
  • 最后一个密钥-k1,1g 无法正确阅读。根据{{​​3}},它应该只使用第一列(0.3220.3等)和一般数字排序。不执行(lap2扇区中的0.322> 0.3)并且不幸的是在lap4扇区中,排序完全不同。命令

    echo -e '0.3\n0.32\n0.28' | sort -g
    

    给出正确的结果。

是否可以为每个排序键-t更改字段分隔符-k

1 个答案:

答案 0 :(得分:2)

-k2使用从第2个字段的开头到行尾的所有字符,因为您没有指定键的结束位置。所以行

0.322_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap2.dat    0.000110687417806       0.0346076270248
0.3_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap2.dat      0.000111161259827       0.0358869210331

是正确排序的,因为在_rsrc:15之前,两个键都以0.0001100.000111排序开头。 manual page中的关键词是

  

KEYDEF是开始和停止位置的F [.C] [OPTS] [,F [.C] [OPTS]],其中F是字段编号,C是字段中的字符位置;两者都是原点1,停止位置默认为行的结尾