首頁 > 軟體

Linux文字處理工具之sort,uniq範例詳解

2020-06-16 17:43:45

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

 


IT145.com E-mail:sddin#qq.com