sort 学习笔记

1  . sort 命令简介
1)  sort 对一个或多个文件中或者来自标准输入的行进行排序 , 比较 ,合并操作 .
2)  输入:文件的内容 或者标准输入 ,当文件名字未给出或者给出的文件名为 - 时 ,sort 从标准输入获得输入数据
3)  输出:默认输出到标准输出 ,当然,可以将其重导向.

2  . sort 的语法格式
sort [OPTION]...[FILE]...

3  . sort 的三种操作模式
1)  sort 模式(默认)
2)  merge 模式(与选项-m有关)
3)  check 模式(check for sortedness)

4  . sort 的三种操作模式详解
1)  sort 模式
--功能.对单一文件按照options指定的规则进行排序
--进入方法. 默认选择,即如果没有指定-c -C -m 选项,则进入该模式
2)  merge 模式
--功能:将多个已排序的文件合并为一个大的已排序文件
--进入方法. -m 选项.
3)  check 模式
--进入方法 . -c 或 -C 选项
--限制 . 只能输入一个文件
--功能 . -c 选项下,对于非完全有序(full sorted)的文件,给出一个包含第一个失序行(the first out-of-order line)的诊断(diagnostic),并以状态1退出(exit with a status of 1);否则,成功退出(exit successfully),以状态0. -C 选项与-c类似,但是不给出诊断信息.
--补充 . -C 即 --check=silent 或者 --check=quiet ;-c 即 --check=diagnose-first . 

4  . sort 的退出状态
0   如果没有任何错误
1   如果调用sort时使用了-c 或者 -C 选项,并且该文件不是有序的(not sorted)
2   如果发生了错误

5  . sort 的行比较机制
1)  每一行称为一个记录(record) ,每个记录被分隔符(field seperator)划分成不同的域(field)
2)  sort 命令行(command line)通常会指定一些域作为排序键,这些键越早声明越先比较
3)  sort 命令比较两个行时,会先按第一个键比较,如果出现键值相同的行,则那两行按第二个键比较,直到分出大小或者所有指定的键都比完了.
4)  如果所有键值都比完了仍然无法分出两行的大小,则sort命令默认会执行一个最后重新排序操作(last-resort comparison),即直接把整行当成键,比较该键大小以分出大小.
5) last-resort comparison 操作可以使用选项(option) --stable 即-s 废止last-resort comparision . --unique 即 -u 也会废止last-resort 操作.(-s 与 -u请参考下面的论述)
6)  当然,如果sort命令行没有指定排序键,则默认以整行作为键

6  . sort 的选项机制
1)  影响
sort的选项将影响输出的内容
2)  定义方式
--在-k 指定的排序键之后指定,该选项只在该键内有效. -k 选项下有详解.
--即不是在-k 指定的键中指定的选项. 具有全局作用. 如果未指定任何排序键,则全局选项将被用于比较;否则,全局选项将被那些没有指定选项的键所继承.
3)  关系
--位置不同,一个在-k之后的键中定义,一个不在
--作用范围不同,一个局部作用,一个全局作用
--书写形式不同,一个不需要前导-,一个需要
 
6  . -t SEPARATOR (--field-separator=SEPARATOR)
1)  以字符SEPARATOR作为分隔各个域(field)的分隔符.
2)  默认情况下,sort以一个非空字符(a non-blank character)和一个空字符(a blank character)之间的空串(null string)作为域分隔符(field separator),默认情况下空字符包含一个空格或者一个tab键. e.g., 字符串"    fst snd " 将被划分成三部分,"    fst" 还有" snd" 以及" ".
3)  应该十分注意,默认情况下域分隔符的定义是非空字符与空字符之间的空串,而不是空字符与非空字符之间的空串.
4)  另外, 域分隔符既不属于左边的域也不属于右边的域,e.g. , sort -t ' '对行" fst snd"进行域划分 ,该串将被分成三个域, 从左往右依次是, 空串,"fst" , "snd" .
5)  如果想把ASCII字符NUL指定为域分隔符,则使用两字符的字符串 '/0' ,例如 , sort -t '/0' 

7  . -k POS1[,POS2] (--key=POS1[,POS2])
1)  POS1和POS2分别指出键的起始和终止位置. 如果没有指出POS2 ,则默认POS2为行尾.
2)  POS格式F[.C][OPTS] .F是域编号,C是字符编号,域和字符编号都从1开始 F.C表示第F个域的第C个字符.(OPTS也影响字符的定位)
3)  如果POS1未指定C ,则默认为1;如果POS2未指定C,则默认为0(1代表域第一个字符,0代表最后一个)
4)  OPTS 选项可以是字母Mbdfinr中的0个或多个
n   该键作为数字进行比较
r   该键按逆序(reverse)排序(从大到小)
f   该键比较过程中忽略大小写(fold lowercase characters into the equivalent uppercase characters when comparing)
b   按该键比较时忽略键值的前导空白符(blank character , 默认含空格和tab键,参考下面的 -b 选项,其中有重要信息)
i   按该键比较时忽略键值的不可打印字符(/a报警 /b退格 /n换行 /r回车等),即只按照可打印字符排序.
d   按该键比较时使用字典序排序(字典须只考虑空白和字母,忽略其它)
M   参照如下的 -M 选项

8  .-b (--ignore-leading-blanks)
1)  忽略前导的空白符
2)  -b 选项作为全局选项时,可以被那些没有指定自己的选项的排序键继承,b会被添加到排序键的起始和终止位置之后.即 sort -b -k2,2 相当于sort -k 2b,2b .
3)  需要注意的是,在起始位置的b只影响起始位置字符的定位,在终止位置的b只影响终止位置字符的定位.例如 sort -b -k 2.2b,3.3b 的含义是,取以第二个域的第二个非空字符作为开始,以第三个域的第3个非空字符作为结束的字符串作为键.
注:
空白符
--by default a blank is a space or a tab
--but the LC_CTYPE locale can change this
locale 不曾研究过,此处不谈.

9  .-f (--ignore-case)
1)  调整键值的小写字母为等价的大写字母(fold lowercase characters into the equivalent uppercase characters when comparing).即忽略大小写.
2)  有一段话我不明白
When used with `--unique' those lower case equivalent lines are thrown away.  (There is currently no way to throw away the upper case equivalent instead. (Any `--reverse' given would only affect the final result, after the throwing away.))

10 . sort 的 -n 选项
1)  按算数值排序(sort numerically) , 关键字值 ,包含可选的空字符,可选的减号(-),0或多个数字字符,这些数字可能被千分位分隔符(thousands separator) 分隔开, 数字后有可选的小数点(decimal-point character) 以及0或多位数字. 关键字值为空的话,看作0 . 
2)  加号(+)和指数符号(exponential notation) 是不能被辨认的

11 . -d (--dictionary-order)
1) 以字典序排序,排序中只关心字母(letters)数字(digits)和空白(blanks)
2)  字母和数字默认是那些 ASCII 字母和数字 , 这由locale 变量 LC_CTYPE 决定

12 . -r (--reverse)
1)  将sort 的结果反序(即,在输出中,键值大的行将比小的先输出)

13 . sort 的 -i 选项
1)  忽略不可打印字符(non-printing character)
2)  -i 选项比  -d 条件弱, 与 -d 同时使用将失效

14 . sort 的 -g 选项
1)  按算数大小排序(sort numerically),使用标准C函数strtod将每行的前缀转换位一个双精度浮点数(use the standard C function strtod to convert a prefix of each line to a double-precision floating point number).
2)  允许浮点数被定义为科学记数法(scientific notation)形式,如 1.0e-34 10e100 .
3)  the LC_NUMERIC locale 决定了小数点字符(decimal-point character).
4)  不报告上溢 下溢 以及转换错误(convertion error)
5)  使用如下的排序顺序(collating sequence)
--不以数字开头的行(所有这样的行被认为相等)
--NaNs(Not a number" values , in IEEE floating point arithmetic) in a consistent but machine-dependent order.
--负无穷(minus infinity)
--递增的有限位数字,+0和-0是等同的.(finite numbers in ascending numeric order (with -0 and +0 equal).
--正无穷(plus infinity)
6)  尽量不用-g ,因为比 -n 慢,而且转换位浮点数时容易丢失信息.
 
15 . -R (--random-sort)
1)  使用随机散列函数将键值做哈希 , 根据哈希值(hash value) 大小进行排序
2)  类似于对输入的行进行随机排列,只不过拥有相同键值的行会排在一起
3)  可以指定多个排序键,那么该哈希函数将应用于所有的排序键;如果想对不同的键使用不同的哈希函数,那么可以多次调用sort函数
4)  使用的哈希函数由--random-source 选项决定
--random-source=FILE
FILE文件将提供一些数据,根据这些数据,使用-R选项时就可以决定使用哪个随机哈希函数

16 . -o (-o OUTPUT-FILE --output=OUTPUT-FILE)
1)  将输出写到文件OUTPUT-FILE ,而不是标准输出
2)  如果文件在指令中同时用于输入与输出,要确保在完成全部的输入之后才打开该文件用于输出. 通常,sort 能做到这一点,因此像sort -o file file 或者cat file | sort -o file 是不会有问题的.但是,-m选项能够使得sort 函数在接受了所有的读入之前就打开OUTPUT-FILE , 这样就会出问题.例如 cat file | sort -m -o file 是不安全的.
3)  可移植的脚本应该保证-o选项不会出现在任何输入文件之后,例如应该避免以下形式的指令,sort myfile -o in_file . 新的系统里,如果POSIXLY_CORRECT 被设置,就会有这个要求.


17 . -s (--stable)
1)  使sort成为稳定的排序算法.(通过避免-k中提到过的最后重排过程(last-resort comparison).
2)  如果sort没有指定任何排序键,那么默认将按行排序,此时,-s就不起作用了(因为last-resort本来就是把根据排序键无法分出大小的行直接做行排序).

18 . -S (-S SIZE 即 --buffer-size=SIZE)
1)  指出sort可以使用的主存(main-memory)缓冲区大小.
2)  SIZE 默认为1024 字节(bytes)
3)  SIZE 的数字(设为n)前如果加b ,表示n bytes;加K表示n*1024 bytes; 加M表示n*(1024^2)bytes;加M表示n*(1024^3)bytes;加G表示n*(1024^4)bytes;T P E Z Y 的情况以此类推.
4)  -S 选项的好处是,如果SIZE合理,那么能够提高内存利用效率,因为毕竟默认提供的内存可能过多也可能过少.
5)  当然,如果SIZE设置得比实际需要的内存少,那么这时候-S就相当于无效.

19 . -u (--unique)
1)  check模式下,将检查输入的数据是否是行有序的;判断机制是,是否存在连续的相等的行(check that no pair of consecutive lines compares equal).
2)  sort模式下,将禁止最后重排(last-resort ,-k选项中有介绍),并对输出中相等的行只保留其第一行.
3)  值得一提的是,-u选项在sort模式下实际上暗含了-s选项;另外,如果sort没有指定排序键,那么-u将无法阻止sort以整行作为键值;还有sort -u 和sort | uniq 是等价的.

20 . -T (-T TEMPDIR 或者 --temporary-directory=TEMPDIR)
1)  指定目录TEMPDIR作为存储sort产生的临时文件的目录(默认目录是/tmp) 
2)  -T的优点是,可以将大量的输入输出操作转移到一些空闲的磁盘上,从而提高I/O效率.

21 . -M (--month-sort 或 --sort=month)
1)  将键值作为月份来比较.键值可以可选地含0或多个空字符(制表符和空格),后面跟着月份的缩写(month name abbreviation).
2)  键值中的小写字符会被预处理为大写字符然后进行比较,比较的预定以顺序是,JAN < FEB < ... < DEC ,不符合规范的月份名字比有效的名字小.
3)  locale LC_TIME 决定了月份的拼写

22 . --compress-program=PROG
//  关于压缩临时文件的,没怎么看懂
   Compress any temporary files with the program PROG.  With no arguments, PROG must compress standard input to standard output, and when given the `-d' option it must decompress standard input to standard output.  Terminate with an error if PROG exits with nonzero status.  White space and the backslash character should not appear in PROG; they are reserved for future use.

23 . --files0-from=FILE
// 没去研究,改日
Disallow processing files named on the command line, and instead process those named in file FILE; each name being terminated by a zero byte (ASCII NUL).  This is useful when the list of file names is so long that it may exceed a command line length limitation.  In such cases, running `sort' via `xargs' is undesirable because it splits the list into pieces and makes `sort' print sorted output for each sublist rather than for the entire list.  One way to produce a list of ASCII NUL terminated file names is with GNU `find', using its `-print0' predicate.  If FILE is `-' then the ASCII NUL terminated file names are read from standard input. 

24 . --batch-size=NMERGE
// 这个需要了解sort 的具体方法,应该不难,暂不去了解了
Merge at most NMERGE inputs at once.

     When `sort' has to merge more than NMERGE inputs, it merges them in groups of NMERGE, saving the result in a temporary file, which is then used as an input in a subsequent merge. 
     A large value of NMERGE may improve merge performance and decrease temporary storage utilization at the expense of increased memory usage and I/0.  Conversely a small value of NMERGE may reduce memory requirements and I/0 at the expense of temporary storage consumption and merge performance.
     The value of NMERGE must be at least 2.  The default value is currently 16, but this is implementation-dependent and may change in the future.

备注:
1) 本文参考资料,请在命令行下输入如下指令获得:
            info coreutils 'sort invocation' 
2) 本文一些论述的例证,将在下一篇文章中给出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值