歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux文本處理工具之sort,uniq實例詳解

Linux文本處理工具之sort,uniq實例詳解

日期:2017/2/28 13:53:04   编辑:Linux教程

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 ~]$

Copyright © Linux教程網 All Rights Reserved