Linux文件排序工具 sort 命令详解(5)

如果省略POS2,则key将自动扩展到行尾,即等价于"POS1,line_end"。如果不省略POS2,则该key可能会跨越多个字段。无论那种情况,跨越多个字段时,key中会保留字段间的分隔符。

OPTS指定的是该key的选项,包括但不限于"bfnrhM",它们的作用和全局选项"-b"、"-f"、"-n"、"-r"、"-h"、"-M"相同。默认情况下,如果key中没有指定任何OPTS,则该key会继承全局选项。当key中单独指定了选项时,这些选项是该key的私有排序选项,将覆盖全局选项。除了"b"选项外,其余选项无论是指定在POS1还是POS2中都是等价的,对于"b"选项,指定在POS1则作用于POS1,指定在POS2则作用于POS2。如果继承了全局选项"-b",则作用于POS1和POS2。

字段前数量不固定的前导空白字符,将使得字段混乱,因此强烈建议总是忽略前导空白字符。数值排序时(即"n"选项)隐含"b"选项。

可以使用多个"-k"选项指定多个key,排序时将按照key的顺序进行排序。第一个key通常称为主排序key(primary key)。第二个key将在第一个key排序的基础上排序,同理,第三个key将在第二个key的排序基础上进行排序。

以下是几个例子:例子中出现了选项"n"的,描述暂不严谨,但目前只能如此描述,在稍后的(4)中解释。

"-k 2" 因为没有指定POS2,所以key扩展到了行尾。因此该key从第2字段第一个字符开始,到行尾结束。

"-k 2,3" :该key从第2字段第一个字符开始到第3字段最后一个字符结束。

"-k 2,2" 该key仅拥有第2字段。

"-k 2,3n""-k 2n,3""-k 2n,3n" :这三者等价,因为除了"b"选项,OPTS指定在POS1或POS2的结果是一样的。

"-k 2,3b""-k 2b,3""-k 2b,3b" :这三者互不等价。

"-k 2n" 该key从第2字段开始直到行尾,都按数值排序。

"-k 2.2b,3.2n" 该key从第2字段的第2个非空白字符开始,到第3字段第2字符(可能包含空白字符)结束,且该key按照数值排序。其实此处的b选项是多余的,因为n隐含了b选项。

"-k 5b,5 -k 3,3n" 定义了两个排序key,主排序key为第5字段不包含空白字符的部分,副key为第三个字段。主key按照默认规则排序,副key按照数值排序。副key在主key排序后的基础上再排序。

"-k 5,5n -k 3b,6b" 主key为第5字段,按照数值排序,副key从第3字段到第六字段,忽略前导空白字符,但是按照默认规则排序。副key在主key排序后的基础上再排序。

(4).当排序规则选项(例如"n"、"d"、"M"、"h")发现不识别的符号时,将立即结束当前key的排序。默认排序规则是字符集的排序规则,通常能识别所有字符,所以总会对整个key进行完整的排序。这是"何时跨字段、跨key比较?"的问题。

例如,指定n选项按数值排序时,由于"n"选项只能识别数字和负号"-",当排序时遇到无法识别字符时,将导致该key的排序立即结束。也就是说,对于"abc 123 456 abc"这样的输入,分隔符为空格,当指定"-k 2,3n"时,虽然排序key包括"123 456",但由于中间的空白字符无法被n识别,使得在排完第2字段"123"时就立即结束该key的排序。

正因如此,使得n选项绝对不会跨字段、跨key进行比较。因此,"-k 2,3n"和"-k 2n"、"-k 2,2n"、"-k 2,4n"的结果是等价的,都只对第2字段按照数值进行排序。但默认的排序规则不会有这样的问题,因为默认排序规则能识别所有字符,也就是说"-k 2,3"、"-k 2"、"-k 2,2"、"-k 2,4"是互不等价的。

同理,"-d"的字典排序规则只能识别字母、数字和空白字符,所以遇到非这3类字符时也将立即结束当前key的排序。"-h"和"-M"也都有字符的识别限制,处理方式也一样。关于"-h"和"-M"选项的说明,见info sort。

需要特意说明的是:n同样不识别空字符串,发现空字符串时也结束排序。这可能会适得按数值排序的结果出人意料。例如:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/13538.html