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) 本文一些论述的例证,将在下一篇文章中给出
sort 学习笔记
最新推荐文章于 2024-04-06 00:23:02 发布