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



有人能解释一下sort -k 1,1sort -k 1,2是做什么的吗?

$ echo -e "9 3 5n8 2 6n7 4 1n"
9 3 5
8 2 6
7 4 1
$ echo -e "9 3 5n8 2 6n7 4 1n" | sort -k 2 -t " " -i
8 2 6
9 3 5
7 4 1
$ echo -e "9 3 5n8 2 6n7 4 1n" | sort -k 1,1 -t " " -i
7 4 1
8 2 6
9 3 5
$ echo -e "9 3 5n8 2 6n7 4 1n" | sort -k 1,2 -t " " -i
7 4 1
8 2 6
9 3 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 5n9 2 6n7 4 1" | sort -k1,1 -t' '
7 4 1
9 2 6
9 3 5
$ echo -e "9 3 5n9 2 6n7 4 1" | sort -k1,2 -t' '
7 4 1
9 2 6
9 3 5
$ echo -e "9 3 5n9 2 6n7 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

请注意 --debug 选项 GNU 排序自版本 8.6 (2010-10-15) 起可用

$ echo -e "9 3 5n8 2 6n7 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 5n8 2 6n7 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 5n8 2 6n7 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 选项禁止显示

相关内容

  • 没有找到相关文章

最新更新