Welcome 微信登录

首页 / 操作系统 / Linux / Linux文本处理工具之sort,uniq实例详解

Linux文本处理工具之sort,uniq实例详解sort:将输入行按照键值字段与数据类型选项以及locate排序语法: sort [option] [file(s)]主要选项:-b 忽略开头的空白-c 检查文件是否已经正确排序-f 排序时忽略大小写,均视为大写字母-m 将几个排序好的文件,合并为一个排序后的输出数据流-M 将前面3个字母依照月份的缩写进行排序-k 定义排序键值字段,按照那个字段(file)进行排序-n 依照数值的大小排序-o outfile 将排序后的结果存入指定的文件-r 以相反的顺序来排序,由大到小-t chat  使用单个字符chat作为默认的字段分隔字符,取代默认的空白字符-u 只有唯一的记录,丢弃所有具相同键值的记录,相同的数据出现一次。--help 显示帮助。--version 显示版本信息1).以字段排序排序键值字段类型
字母说明
b忽略开头的空白
d字典顺序
f不区分字母大小写
g以一般的浮点数字进行比较,只适用于GNU版本
i忽略无法打印的字符
n以整数(数字)比较
r倒置排序的顺序
实例1:以传统ASCII码顺序排序[linuxidc@test ~]$ LC_ALL=C sort /etc/passwd #gzdev1:x:829:829::/home/gzdev1:/bin/bash#gzdev2:x:830:830::/home/gzdev2:/bin/bash...Meat:x:814:814::/home/Meat:/bin/bashadm:x:3:4:adm:/var/adm:/sbin/nologin...bin:x:1:1:bin:/bin:/sbin/nologincvsroot:x:778:502::/home/cvsroot:/bin/bash...dbus:x:81:81:System message bus:/:/sbin/nologindovecot:x:99:99:dovecot:/usr/libexec/dovecot:/sbin/nologin...ftpuser:x:505:505::/home/ftpuser:/bin/bashgdm:x:42:42::/var/gdm:/sbin/nologin 附:# LC_ALL=C 是为了去除所有本地化的设置,让命令能正确执行。# LC_ALL :它是一个宏,如果该值设置了,则该值会覆盖所有LC_*的设置值。注意,LANG的值不受该宏影响。# “C”是系统默认的locale,"POSIX"是"C"的别名。所以当我们新安装完一个系统时,默认的locale就是C或POSIX。 实例2:以用户名称排序[linuxidc@test ~]$ sort -t: -k1,1 /etc/passwdadm:x:3:4:adm:/var/adm:/sbin/nologinavahi:x:70:70:Avahi daemon:/:/sbin/nologinbin:x:1:1:bin:/bin:/sbin/nologincvsroot:x:778:502::/home/cvsroot:/bin/bashdaemon:x:2:2:daemon:/sbin:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologingdm:x:42:42::/var/gdm:/sbin/nologin...# -t指定分隔符为分号,-K指定以第一个字段第一个字符进行排序 实例3:反向UID排序[linuxidc@test ~]$ sort -t: -k3nr /etc/passwd[linuxidc@ test ~]$ sort -t: -k3nr,3 /etc/passwd# 更精确的字段规格应为-k3,3nr 或-k3nr,3 或-k3,3 -n -r,# 表示从字段3起始处开始,以数值类型反向排序,并结束与字段3的结尾nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologinsninf_kenchoi:x:860:860::/home/sninf_kenchoi:/bin/bashlinuxidc:x:859:859::/home/linuxidc:/bin/bashgz_kinma:x:857:857::/home/gz_kinma:/bin/bashsninf_tonyhung:x:856:856::/home/sninf_tonyhung:/bin/bashsninf_simonlau:x:855:855::/home/sninf_simonlau:/bin/bashsninf_kenchan:x:854:854::/home/sninf_kenchan:/bin/bashsninf_thomaschan:x:853:853::/home/sninf_thomaschan:/bin/bashgz_jones:x:851:851::/home/gz_jonesyan:/bin/bash...# -t指定分隔符为分号,-K指定以第3个字段进行排序,n表示以整数比较,r表示逆序 实例4:以唯一的GID排序[linuxidc@test ~]$ sort -t: -k4n -u /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinmail:x:8:12:mail:/var/spool/mail:/sbin/nologinnews:x:9:13:news:/etc/news:...# -t指定分隔符为分号,-K指定以第4个字段进行排序,n表示以整数比较,u表示唯一排序 2).文本块排序[linuxidc@test ~]$ cat > my-friends#SORTKEY: ma,KinKin mazhujiangxincheng 78D-305 LetaijieTaiShan#SORTKEY:yan,JonesJones yanDongpu 68B_602 DongpujieYangJiang#SORTKEY:wu,WillWill wuShangshe 36A_205 HeguanluMaoMing[linuxidc@test ~]$ cat my-friends |awk -v RS="" "{ gsub(" ", "^Z"); print }" | sort -f#SORTKEY: ma,Kin ^ZKin ma^Zzhujiangxincheng 78 ^ZD-305 Letaijie ^ZTaiShan#SORTKEY:wu,Will^ZWill wu^ZShangshe 36^ZA_205 Heguanlu^ZMaoMing#SORTKEY:yan,Jones ^ZJones yan^ZDongpu 68^ZB_602 Dongpujie ^ZYangJiang[linuxidc@ test ~]$ cat my-friends |  #在地址数据文件里的管道awk -v RS="" "{ gsub(" ", "^Z"); print }" | #转换地址为单个行sort -f |                                                                     #排序地址数据,忽略大小写awk -v ORS=" " "{ gsub("^Z", " "); print }"#恢复行结构,注意:部分版本无法恢复#gsub()功能为全局性替换,类似于sed下的s/x/y/g架构#SORTKEY: ma,KinKin mazhujiangxincheng 78D-305 LetaijieTaiShan#SORTKEY:wu,WillWill wuShangshe 36A_205 HeguanluMaoMing#SORTKEY:yan,JonesJones yanDongpu 68B_602 DongpujieYangJiang[linuxidc@ test ~]$ cat my-friends |awk -v RS="" "{ gsub(" ", "^Z"); print }" | sort -f |awk -v ORS=" " "{ gsub("^Z", " "); print }" |grep -v "# SORTKRY"                         #删除标记行 3).sort的稳定性:不稳定 [linuxidc@ test ~]$ sort -t_ -k1,1 -k2,2 << EOF> one_two> one_two_three> one_two_four> one_two_five> EOFone_twoone_two_fiveone_two_fourone_two_three 4).删除重复uniq :过滤数据选项 :        -c 显示重复次数        -d 仅显示重复行        -u 仅显示未重复行用法:sort ... | uniq ... 实例:[linuxidc@ test ~]$ cat > number     onetwothreefourfourfivetwooneone[linuxidc@ test ~]$ sort number | uniq #排序fivefouronethreefourtwo[linuxidc@ test ~]$ sort number | uniq -c #顺带显示重复次数      1 five      2 one      1 threefour      2 two[linuxidc@test ~]$ sort number | uniq -d #仅显示重复行onetwo[linuxidc@test ~]$ sort number | uniq -u #仅显示未重复行fivethreefour[linuxidc@test ~]$本文永久更新链接地址