排序-k 1,2如何工作?

时间:2014-01-23 11:10:51

标签: linux bash sorting

有人可以解释sort -k 1,1sort -k 1,2的作用吗?

$ echo -e "9 3 5\n8 2 6\n7 4 1\n"
9 3 5
8 2 6
7 4 1

$ echo -e "9 3 5\n8 2 6\n7 4 1\n" | sort -k 2 -t " " -i
8 2 6
9 3 5
7 4 1

$ echo -e "9 3 5\n8 2 6\n7 4 1\n" | sort -k 1,1 -t " " -i
7 4 1
8 2 6
9 3 5

$ echo -e "9 3 5\n8 2 6\n7 4 1\n" | sort -k 1,2 -t " " -i
7 4 1
8 2 6
9 3 5

2 个答案:

答案 0 :(得分:5)

引自man sort

   -k, --key=POS1[,POS2]
          start  a  key at POS1 (origin 1), end it at POS2 (default end of
          line).  See POS syntax below

所以:

-k 2

将从键2开始,直到该行结束。

-k 1,1

将从键1开始,以键1结束。同样适用于-k 1,2


您的示例输入没有显示差异,但如果您稍微修改它,那么它可能会更清楚:

$ echo -e "9 3 5\n9 2 6\n7 4 1" | sort -k1,1 -t' '
7 4 1
9 2 6
9 3 5
$ echo -e "9 3 5\n9 2 6\n7 4 1" | sort -k1,2 -t' '
7 4 1
9 2 6
9 3 5
$ echo -e "9 3 5\n9 2 6\n7 4 1" | sort -k1,1 -t' ' -s
7 4 1
9 3 5
9 2 6

特别注意案例1和3.即使要对键1应用排序,案例1中的输出也会受到影响。使用-s选项以稳定排序:

   -s, --stable
          stabilize sort by disabling last-resort comparison

答案 1 :(得分:0)

请注意自版本8.6(2010-10-15)

以来可用的GNU排序的--debug选项
$ echo -e "9 3 5\n8 2 6\n7 4 1" | sort --debug -k 2 -t " " -i
sort: using `en_US.utf8' sorting rules
8 2 6
___
_____
9 3 5
___
_____
7 4 1
___
_____
$ echo -e "9 3 5\n8 2 6\n7 4 1" | sort --debug -k 1,1 -t " " -i
sort: using `en_US.utf8' sorting rules
7 4 1
_
_____
8 2 6
_
_____
9 3 5
_
_____
$ echo -e "9 3 5\n8 2 6\n7 4 1" | sort --debug -k 1,2 -t " " -i
sort: using `en_US.utf8' sorting rules
7 4 1
___
_____
8 2 6
___
_____
9 3 5
___
_____

注意每行中的最后一个 _ 显示整行使用的第二个比较是最后的手段,可以使用-s选项来抑制