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/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
...
bin:x:1:1:bin:/bin:/sbin/nologin
cvsroot:x:778:502::/home/cvsroot:/bin/bash
...
dbus:x:81:81:System message bus:/:/sbin/nologin
dovecot:x:99:99:dovecot:/usr/libexec/dovecot:/sbin/nologin
...
ftpuser:x:505:505::/home/ftpuser:/bin/bash
gdm: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/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
avahi:x:70:70:Avahi daemon:/:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
cvsroot:x:778:502::/home/cvsroot:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
gdm: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/nologin
sninf_kenchoi:x:860:860::/home/sninf_kenchoi:/bin/bash
linuxidc:x:859:859::/home/linuxidc:/bin/bash
gz_kinma:x:857:857::/home/gz_kinma:/bin/bash
sninf_tonyhung:x:856:856::/home/sninf_tonyhung:/bin/bash
sninf_simonlau:x:855:855::/home/sninf_simonlau:/bin/bash
sninf_kenchan:x:854:854::/home/sninf_kenchan:/bin/bash
sninf_thomaschan:x:853:853::/home/sninf_thomaschan:/bin/bash
gz_jones:x:851:851::/home/gz_jonesyan:/bin/bash
...
# -t指定分隔符為分號,-K指定以第3個字段進行排序,n表示以整數比較,r表示逆序
實例4:以唯一的GID排序
[linuxidc@test ~]$ sort -t: -k4n -u /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:
...
# -t指定分隔符為分號,-K指定以第4個字段進行排序,n表示以整數比較,u表示唯一排序
2).文本塊排序
[linuxidc@test ~]$ cat > my-friends
#SORTKEY: ma,Kin
Kin ma
zhujiangxincheng 78
D-305 Letaijie
TaiShan
#SORTKEY:yan,Jones
Jones yan
Dongpu 68
B_602 Dongpujie
YangJiang
#SORTKEY:wu,Will
Will wu
Shangshe 36
A_205 Heguanlu
MaoMing
[linuxidc@test ~]$ cat my-friends |
awk -v RS="" '{ gsub("\n", "^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("\n", "^Z"); print }' | #轉換地址為單個行
sort -f | #排序地址數據,忽略大小寫
awk -v ORS="\n" '{ gsub("^Z", "\n"); print }'
#恢復行結構,注意:部分版本無法恢復
#gsub()功能為全局性替換,類似於sed下的s/x/y/g架構
#SORTKEY: ma,Kin
Kin ma
zhujiangxincheng 78
D-305 Letaijie
TaiShan
#SORTKEY:wu,Will
Will wu
Shangshe 36
A_205 Heguanlu
MaoMing
#SORTKEY:yan,Jones
Jones yan
Dongpu 68
B_602 Dongpujie
YangJiang
[linuxidc@ test ~]$ cat my-friends |
awk -v RS="" '{ gsub("\n", "^Z"); print }' |
sort -f |
awk -v ORS="\n" '{ gsub("^Z", "\n"); 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
> EOF
one_two
one_two_five
one_two_four
one_two_three
4).刪除重復
uniq :過濾數據
選項 :
-c 顯示重復次數
-d 僅顯示重復行
-u 僅顯示未重復行
用法:
sort ... | uniq ...
實例:
[linuxidc@ test ~]$ cat > number
one
two
threefour
four
five
two
one
one
[linuxidc@ test ~]$ sort number | uniq #排序
five
four
one
threefour
two
[linuxidc@ test ~]$ sort number | uniq -c #順帶顯示重復次數
1 five
2 one
1 threefour
2 two
[linuxidc@test ~]$ sort number | uniq -d #僅顯示重復行
one
two
[linuxidc@test ~]$ sort number | uniq -u #僅顯示未重復行
five
threefour
[linuxidc@test ~]$