linux/unix命令详解之sort

Comments: 2 Comments
Published on: 2012 年 02 月 20 日


功能说明:将文本文件内容加以排序。
语  法:sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]

补充说明:sort可针对文本文件的内容,以行为单位来排序。
参  数:
-b 忽略每行前面开始出的空格字符。
-c 检查文件是否已经按照顺序排序。
-g 按照一般的数字排序。
-d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
-f 排序时,将小写字母视为大写字母。
-i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
-k 按某列排序,下边详讲。
-m 将几个排序好的文件进行合并。
-M 将前面3个字母依照月份的缩写进行排序。
-n 依照数值的大小排序。
-s 稳定排序,如果对输入顺序有要求的话,这个选项很重要。
-S 限制排序所用的内存。单位:M\G\T\B\E\Z\Y
-o<输出文件> 将排序后的结果存入指定的文件。
-r 以相反的顺序来排序。
-t<分隔字符> 指定排序时所用的栏位分隔字符。
-u 去除重复行。
--help 显示帮助。
--version 显示版本信息。

sort默认的会以默认分隔符空格、制表符分隔字段,以第一个字段进行字典序的升序排列,没有指定输入文件则从标准输入获取数据。

sort选项没特别需要讲的,需要注意的就是-k。-k选项的具体语法格式如下:
[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]
这个语法格式可以被其中的逗号(“,”)分为两大部分,Start部分和End部分。
如果不设定End部分,那么就认为End被设定为行尾。Start部分也由三部分组成,其中的Modifier部分就是我们之前说过的类似n和r的选项部分。

我们重点说说Start部分的FStart和C.Start。
C.Start也是可以省略的,省略的话就表示从本域的开头部分开始。之前例子中的-k 2和-k 3就是省略了C.Start的例子喽。
FStart.CStart,其中FStart就是表示使用的域,而CStart则表示在FStart域中从第几个字符开始算“排序首字符”。
同理,在End部分中,你可以设定FEnd.CEnd,如果你省略.CEnd,则表示结尾到“域尾”,即本域的最后一个字符。或者,如果你将CEnd设定为0(零),也是表示结尾到“域尾”。

在modifier部分还可以用到的选项:
可以用到b、d、f、i、n 或 r。
其中n和r你肯定已经很熟悉了。
b表示忽略本域的签到空白符号。
d表示对本域按照字典顺序排序(即,只考虑空白和字母)。
f表示对本域忽略大小写进行排序。
i表示忽略“不可打印字符”,只针对可打印字符进行排序。(有些ASCII就是不可打印字符,比如\a是报警,\b是退格,\n是换行,\r是回车等等)

另外有时候在sort命令后会看到+1 -2这些符号,这是什么东东?请忽略它,现在手册也已经没有这个介绍了,是一种相当古老的用法。

实例:
以第一个关键列的第二个字母开始进行排序:
$ sort -k 1.2 file.txt

以关键列第一列的第二个字母进行排序,如果第二个字母相同则根据第三列以数值的标准进行降序排列。
$ sort -k 1.2,1.2 -k 3,3nr file.txt

我猜你可能也喜欢:

2 Comments - Leave a comment
  1. Jian Xu说道:

    赞~我用过得比较多的一个用法好像是sort -u|uniq

    • 三江小渡说道:

      这些都是手册内容和一些个人使用经验,想整理出来给之后学习的人一些帮助,我这两天在消化一本正则方面的书,自己在使用正则过程中感觉正则优化很重要,想写篇正则优化出来。到时候你要多指正啊~~

      ps:那个RPG还没有时间玩,已经下好了,好想玩啊。。TT

Leave a comment

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>


Welcome , today is 星期五, 2017 年 12 月 15 日