NODE_154_length 847 2997
NODE_154_length 3283 4509
NODE_154_length 4672 5715
NODE_154_length 6977 7768
NODE_29_length 3790 4317
NODE_29_length 4356 4712
NODE_29_length 4356 4712
NODE_29_length 158 319
NODE_29_length 1 97
NODE_29_length 1 96Run Code Online (Sandbox Code Playgroud)
我想要这样的输出:
NODE_154_length 847 2997
NODE_154_length 3283 4509
NODE_154_length 4672 5715
NODE_154_length 6977 7768
NODE_29_length 1 97
NODE_29_length 1 96
NODE_29_length 158 319
NODE_29_length 4356 4712
NODE_29_length 4356 4712
NODE_29_length 3790 4317Run Code Online (Sandbox Code Playgroud)
或者
NODE_29_length 1 97
NODE_29_length 1 96
NODE_29_length 158 319
NODE_154_length 847 2997
NODE_154_length 3283 4509
NODE_29_length 3790 4317
NODE_29_length 4356 4712
NODE_29_length 4356 4712
NODE_154_length 4672 5715
NODE_154_length 6977 7768Run Code Online (Sandbox Code Playgroud)
sort -k2,2 file 这对所有第 2 列进行排序并给出:
NODE_100_length_46867_cov_66.420166 1 50
NODE_104_length_141_cov_120.127663 1 210
NODE_104_length_141_cov_120.127663 1 210
NODE_104_length_141_cov_120.127663 1 225Run Code Online (Sandbox Code Playgroud)
这会干扰每个节点的完整坐标。
如果我sort -k2 file再次尝试这会给我奇怪的输出,而不是排序的方式。
我无法理解如何在 Linux 中使用 -k 选项。我正在使用 bash,Linux 13.10
语法是-k<start>[<flags>][,<end>[<flags>]](如果,<end>省略,那是该行的结尾)。
这将要排序的行部分定义为一个排序键。
<start>并<end>参考字段编号。2for<start>表示第 2 个字段的开始,而2for<end>表示第 2 个字段的结束。
默认情况下,字段由非空白和空白之间的过渡分隔。例如,在:
NODE_154_length 847 2997
Run Code Online (Sandbox Code Playgroud)
这些字段是:
[NODE_154_length][ 847][ 2997]
Run Code Online (Sandbox Code Playgroud)
执行sort -k2,对从第二个字段开始到行尾结束的行部分进行排序。所以上面,在[ 847 2997]。sort正在做词法比较是默认的。
sort -k2,2只会考虑[ 847]比较。
如果要对特定键进行数值比较,则必须将n <flag>加到排序键中。这样, 847就会被转换成一个数字。这就是为什么-k2,2nand-k2n会起作用,因为 the[ 847]和[ 847 2997] strings 都转换为number 847。
因此,要获得第一个结果,您需要按字典顺序对第一个字段进行排序,然后(第一个字段的排序相同)按数字顺序对第二个字段进行排序。是这样写的:
sort -k1,1 -k2,2n
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,您希望按数字对第二个字段进行排序,当它们排序相同时,保留原始顺序。
这就是您需要稳定排序-s选项的地方:
sort -s -k2,2n
Run Code Online (Sandbox Code Playgroud)
(默认情况下,在键排序相同的情况下,sort诉诸于对整行进行词法比较;-s禁用它)。