2021-05-12 14:32:11
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/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 ~]$
本文永久更新連結地址:http://www.linuxidc.com/Linux/2016-04/130089.htm
相關文章