a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 93|回复: 0

[综合辅导] Linux认证辅导之关于linuxsort命令用法

[复制链接]
发表于 2012-8-4 12:07:07 | 显示全部楼层 |阅读模式
Linux认证辅导之关于linuxsort命令用法
' M$ S) X% ^2 f- S: I" C& tlinuxsort命令的用法
4 ^) a: v& w0 ^- R2 F- B7 csort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始!
* C  k& Q! B& x+ J; P1 sort的工作原理8 v/ D; `) a3 V- C+ I  U3 Z
sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
6 y$ k# R' j( n& ^7 [; n0 R; ~[rocrocket@rocrocket programming]$ cat seq.txt
6 M5 u  ^' A4 f# {& k% r) Ybanana
- y& ~3 A6 ]1 T, z1 kapple& Q; M- K" z% v
pear  I# Z# B* W! v. Q' t$ ?
orange$ H- W" v& W& M/ Y" h. ~; j; Z
[rocrocket@rocrocket programming]$ sort seq.txt! u" ?& J$ m, ~+ q& g0 S
apple% g+ b6 L; B: u
banana4 Y) s5 s! [: e$ v4 j% r3 H3 m
orange
! t1 K" m1 ]. ~) @2 l' rpear+ O6 s, G) y) c
2 sort的-u选项9 a6 A: U3 Y& N7 O1 K
它的作用很简单,就是在输出行中去除重复行。) ]; z) T/ C% W& D7 [' [+ g6 P+ Z
[rocrocket@rocrocket programming]$ cat seq.txt
) m$ E# X7 }* T" Ybanana5 c2 O  l- x8 u
apple
2 I+ q  c1 [# l# J' H; Bpear
+ Q' w, T3 z  [" K! C0 Q+ z  G: Forange
" i3 q* ?0 o6 X% s, L+ Apear; Z6 {/ F$ d5 I; f% W7 D
[rocrocket@rocrocket programming]$ sort seq.txt9 a8 i+ a+ y* i9 @# k7 s) e+ u
apple% N5 Z& s6 D, H1 A3 S* K
banana7 _9 h6 e- ]( A) h5 N. b5 {7 Y8 F& r
orange
* T! D" T) E2 _, `7 cpear
# c. L8 |& R$ j( Cpear+ t, j9 O8 h4 x; ~
[rocrocket@rocrocket programming]$ sort -u seq.txt
" h1 c2 {8 Z7 i/ d& J$ Mapple$ A, P7 m3 U/ F: U9 b
banana1 |' v# h. g; ~7 Y
orange
+ }% A, }/ Y! P' Hpear3 M# A, q) J2 h( M
pear由于重复被-u选项无情的删除了。7 y" s2 k8 T. n2 G' _* _8 w
3 sort的-r选项% _* E8 F0 ^- n3 `
sort默认的排序方式是升序,如果想改成降序,就加个-r就搞定了。7 h0 e, H6 o4 h' v
[rocrocket@rocrocket programming]$ cat number.txt" Z& f9 b3 ]) t8 o7 C: K' P9 v
1
- ^, W  e( p1 G* E/ C1 j3: P5 d1 [( X6 ]9 ]" r
5
# ?6 _, F3 H0 J29 q1 \/ g9 D- T, |
40 s( `6 S* I  _! A) z) k. G
[rocrocket@rocrocket programming]$ sort number.txt' h4 Y( f( z+ c8 N9 D* }, k
1
* v  q: Z- S) F: w2 f0 F" p2
# d$ C( T% U" N& R% ~6 j$ O32 n+ G3 L; N7 t% p2 C4 t
4
% }. M# \' O. p; U) c, D& q9 ~5& T# o. I& j6 V- ?2 t
[rocrocket@rocrocket programming]$ sort -r number.txt
" a+ ?5 M7 ?1 c4 H+ F/ Q. o55 O- _5 l( p  B* a0 `: W
41 z' U; Z$ K* f7 \
36 z( V1 F5 v- L& X9 t4 E
2
5 P3 E3 R2 g! k6 I7 n1" C& d2 B6 I! s% \7 @1 z
4 sort的-o选项5 c5 m6 D+ c+ S$ a

) l  y( O( R: K
+ x4 C. H3 J; O( i+ W/ d: ~由于sort默认是把结果输出到标准输出,所以需要用重定向才能将结果写入文件,形如sort filename 》 newfile。" b" R+ T. _* ]6 F$ n) ~4 P" z5 `
但是,如果你想把排序结果输出到原文件中,用重定向可就不行了。
8 E8 V$ ]# j8 d! u# G[rocrocket@rocrocket programming]$ sort -r number.txt 》 number.txt
6 F! z5 t1 U. U[rocrocket@rocrocket programming]$ cat number.txt
" y+ |1 V- y- M: L[rocrocket@rocrocket programming]$
' w) `8 @- c2 V7 j0 t% c看,竟然将number清空了。
+ G% f( I- j& Q就在这个时候,-o选项出现了,它成功的解决了这个问题,让你放心的将结果写入原文件。这或许也是-o比重定向的唯一优势所在。
3 f* x3 z1 ^6 a" ]* V  n& j[rocrocket@rocrocket programming]$ cat number.txt8 \& K$ b6 u0 Y! N% _/ y! B$ {0 L
1
; f1 R# V" I0 E4 g; j% v3: T( k' M* c' [" L; Z  P. H! z
59 z# g  m$ ]" ?* }! r
2$ m& o1 }5 g( n& n6 g
4
$ s' ?6 o/ e( T[rocrocket@rocrocket programming]$ sort -r number.txt -o number.txt$ u) z' r2 n0 T( _! y* ~/ J
[rocrocket@rocrocket programming]$ cat number.txt/ p5 R; F8 ^5 d: z. B
5" T0 a; }8 j. s" T
4
" |& _, g7 x& v# C35 Y0 J7 `" L& q
2
- I* t. h. z0 D  z& B" J11 w; O1 s% J* H4 @5 {
5 sort的-n选项3 A8 r$ ^3 }  ~: y. w( ~( t
你有没有遇到过10比2小的情况。我反正遇到过。出现这种情况是由于排序程序将这些数字按字符来排序了,排序程序会先比较1和2,显然1小,所以就将10放在2前面喽。这也是sort的一贯作风。. u/ H& z3 p# ?" z8 @& o, F
我们如果想改变这种现状,就要使用-n选项,来告诉sort,“要以数值来排序”!0 \3 T5 K) W  m; y% k6 b. c! o
[rocrocket@rocrocket programming]$ cat number.txt
/ p& W! B( \1 s3 T2 n1' D- T  X, V6 i; t+ o" q8 h! K
107 `0 r* W7 o, i; ~1 Z
19
+ F) L8 m8 R( D5 I9 Q6 G% H- v. k( ^11
3 |3 f, k; v2 @9 \2
( P( X5 U% x( O) a. L. h% E5- |* ?& \, s$ G; p) }6 G
[rocrocket@rocrocket programming]$ sort number.txt0 t: y; Z2 i# b2 @( c/ w# ?
1
$ w8 q# q8 U4 r+ k! Z* Y4 M) n10
* Y! s' T1 h6 f+ h8 V- f/ L11
7 \2 `. b0 U, ]1 ~/ h191 O' A* Y/ ^6 P; P' z6 U
2
  u/ v$ L6 o. e5
' i# E6 S, Z/ D8 q7 U[rocrocket@rocrocket programming]$ sort -n number.txt
  O7 M# C2 b2 [, R% u6 `1
. i5 t) z5 A4 @% k2
% _2 \* |, A4 t5 E9 k- [5
* u( N6 Q4 T. L! K3 q( x3 a. M' \! X10
% h9 D. B3 L6 t& P' M11
) ]) h" K. A0 p% T/ M196 L# V# M# `, c6 O9 }! {' v- z
6 sort的-t选项和-k选项" V2 a4 }0 ~# W. `; F' S2 @$ ^( w
如果有一个文件的内容是这样:
1 [: D' D7 R8 h# V6 e9 @[rocrocket@rocrocket programming]$ cat facebook.txt
- K( e# R  R2 [3 ]0 U1 Qbanana:30:5.5
3 d/ ^- V# Z, Fapple:10:2.5
9 \+ h8 h/ V8 Q0 j6 k$ bpear:90:2.3
% V0 L$ ?5 c9 W9 T: {; yorange:20:3.4
" O) H! `8 ?. b这个文件有三列,列与列之间用冒号隔开了,第一列表示水果类型,第二列表示水果数量,第三列表示水果价格。+ s# O, Z& G8 ], m7 f8 F" a6 s9 `0 r  ^9 Z
那么我想以水果数量来排序,也就是以第二列来排序,如何利用sort实现?
. X7 @- C: Q! Q' s0 L# i幸好,sort提供了-t选项,后面可以设定间隔符。(是不是想起了cut和paste的-d选项,共鸣~~)4 i7 \% c0 o, L5 r2 X, S/ @8 S4 t
指定了间隔符之后,就可以用-k来指定列数了。
. D2 B' k$ k% c# e4 M[rocrocket@rocrocket programming]$ sort -n -k 2 -t : facebook.txt+ w( z$ G" \+ p# Y1 u( F  @6 N- v
apple:10:2.5
9 C0 ], P3 b- T. ^8 Dorange:20:3.4
* r# x% x& \) ], p9 |& ]  P$ Jbanana:30:5.5
5 x( N( E4 t# _* K% O/ [# P, [pear:90:2.3. l. ~  @) q8 y4 ]
我们使用冒号作为间隔符,并针对第二列来进行数值升序排序,结果很令人满意。
0 N5 r7 ^) o" g7 其他的sort常用选项
& b, l8 b# f# R* n( ^-f会将小写字母都转换为大写字母来进行比较,亦即忽略大小写# _5 a3 |6 f# W
-c会检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1; L$ y% a3 z  ^
-C会检查文件是否已排好序,如果乱序,不输出内容,仅返回1
5 `: E: {+ F; T4 t& P8 s/ Y-M会以月份来排序,比如JAN小于FEB等等' \' `) Y8 Q) R3 x+ i, h& r1 j4 v
-b会忽略每一行前面的所有空白部分,从第一个可见字符开始比较。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-17 09:22 , Processed in 0.361175 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表