Linux sort命令的几个细节问题
上一篇 /
下一篇 2012-09-05 09:40:03
/ 个人分类:Linux
51Testing软件测试网.Jc*Za w;VB9K)f Linuxsort命令的原理是逐行按字符进行比较排序,当然,也可以通过命令行参数设定按数字进行比较,或者指定行间的分隔符,对某一个或一些字段按照自己指定的规则进行排序。这是一个很常用而且很方便的命令,但是其中的一些细节需要注意,否则会得到错误的排序结果。51Testing软件测试网/f%v}x{l
51Testing软件测试网 J1p3`La
F{Xf
r 1、比较方式51Testing软件测试网A9x|3AdD
vI B,DT J\0 前面说过,sort命令默认是按照字符串排序,真的是这样么?看看sort的help信息,末尾有这样的文字:51Testing软件测试网
Xe'_S,l/@
*** WARNING ***51Testing软件测试网6Ik e VM+PP The locale specified by the environment affects sort order.51Testing软件测试网DV u,e7d~6]e:Tm Set LC_ALL=C to get the traditional sort order that uses Z SAv,eA/jD6t5a#q0native byte values. |
51Testing软件测试网kW |J8E
\-`5J^8L 看来,环境变量也能影响sort的排序结果。实际试试看:51Testing软件测试网 v#ABBL J
~$ cat text51Testing软件测试网IaiIz2@U%Do)? 11$51Testing软件测试网 gRA9^1]B 1{1 ak+J0~ N9yv!x0~$ sort text51Testing软件测试网 LnZsL)\z~~ 1{151Testing软件测试网Q5^fN@v;A 11$51Testing软件测试网 ka%Q2tJb
U'BF
f(j ~$ echo $LC_ALL51Testing软件测试网#R7KyS-]e ~$ |
51Testing软件测试网A:C})}N4S
论ASCII字符的大小,’{’应该比’1’大,但是上面的结果显示,当LC_ALL变量为空值时,sort命令输出了错误的排序结果。不过,在更多的
平台上实验发现,LC_ALL为空的时候并不一定会输出这个错误的结果,具体原因不详。不过,如果按照sort的帮助信息设置LC_ALL,则结果是正确
的,’1’排在’{’前面。
)f)_"_-r/b$xj04sa'J.d7mM+gc0 如果了解LC***系列的变量,其实只需要设置LC_COLLATE即可,该变量控制的是字符串的排序方式,在手头上的几种平台上实验,结果都是正确的。51Testing软件测试网/aCU9UFi;N0r
(M#Y"t7w1A+x;DM)GC0 2、按数字排序
I]5H7K5[,cRL)x:B0TM?0k&S0 加-n参数按数字排序。如果一行中还有非数字字符,则按照非数字字符前面的数字大小进行排序。51Testing软件测试网2BrE'Mk
~$ cat text51Testing软件测试网1d$[;Q}w 11$ 4NQ3PsM Z
L01{1 "n0rG8uoh&I0~$ export LC_ALL=C T/zV9H
d(XpL0~$ sort text p"jj8i0f[U011$51Testing软件测试网Z#W[I(WYD5Ap 1{151Testing软件测试网K9_~2T/s"V.q ~$ sort -n text 51Testing软件测试网&H+dEJ
Ts(c1a/lB9? 1{1 2XJ$tDN&D011$ |
51Testing软件测试网fm0q9??y4x| 3、重定向
vZ1QT T}u0u5H08G(ok a.Kk0 一般sort命令将排序结果输出到终端,如果想写入文件可以用重定向的方式,但是,如果想让排序结果直接写到排序前的文件,用一般的重定向方式sort file_name > file_name达不到效果,需要用sort命令的-o参数。51Testing软件测试网`H E,j'\:F T
51Testing软件测试网aU
U"k$[G 4、分隔字段
K.l3M4|PP&NPa/K
c051Testing软件测试网 B:U;iwL,lR-{K
b 默认的排序是以行为单位的排序,如果想按照某个字段进行排序,可以用-t选项指定字段分隔符,-k指定要排序的字段。51Testing软件测试网8C{?.Bx
51Testing软件测试网4p O2v
@)t2z3fU6z -k参数的格式为-k start[,end],需要注意的是,如果省略了end,则需要比较到行末,例如:51Testing软件测试网1T0t)At {r;Y
GT
~$ cat text51Testing软件测试网1\X-~3t`9Y1]%j 1|101|2 M/H#q)e8B"CM01|10|2 ,jR'x(D{U4mSeE0~$ echo $LC_ALL h0U(dU&T1V~W0C ,n)s]Jl0lz0~$ sort -t "|" -k 2 text51Testing软件测试网r5?
XR\ 1|101|2 p
Y
Fn(GW"r01|10|2 v+\!N%A,YX0~$ sort -t "|" -k 2,2 text }?n*@X'KHF01|10|251Testing软件测试网`h8G9H ]y*k(V 1|101|2 |
/tC&V\f0 虽然10排在101前面,但是不指定字段结束时,默认会继续比较,即比较’|’和’1’,所以有上面的结果。51Testing软件测试网n(sM:H5MO M
.w8e3Q$k$e0 通常,我们只希望按照一个或者多个字段排序,而不希望从某个字段开始一直比较到行末,所以用这个参数时最好同时指定start和end。51Testing软件测试网`!T[J2a'E0o ]
Z6E!E"} sm;PZ^0 5、多条件排序
W@5H"n+oU051Testing软件测试网R1uY,l
k*V)b:L 在按字段排序时如果想采用多个排序条件,如先按第二列升序,如果相同则按第三列降序,可以使用多个-k参数,如-k 2,2n –k 3,3nr
:d'ib3C MxF0
收藏
举报
TAG: