當前位置:
首頁 > 知識 > 一個Linux命令幫你對文本排序

一個Linux命令幫你對文本排序



來自:編程珠璣(微信號:shouwangxiansheng)


前言


在Linux下,有時候需要對文本內容進行排序,例如按照字典順序排序,按照數字排序或者按照特定列排序等等。今天我們就藉助一個命令-sort來滿足我們對文本排序的需求。


按照字典順序排序


假如有文本內容test1.txt如下(偷偷問一句:你在使用哪個linux發行版?):

Debian

 
Gentoo
Gentoo
CentOS
Fedora
ubuntu
Kali
redhat
Arch
OpenSuse

現在要對文本內容按照字典升序排序,只需使用下面的命令即可:

sort

 

test1

.txt


輸出結果如下:

Arch


CentOS
Debian 
Fedora
Gentoo
Gentoo
Kali
OpenSuse
redhat
ubuntu

可以看到輸出結果按照字典順序的升序進行了排序。如果需要降序輸出只需要使用-r參數,如:

sort

 

-r

 

test1

.txt



輸出結果如下:

ubuntu


redhat
OpenSuse
Kali
Gentoo
Gentoo
Fedora
Debian 
CentOS
Arch

去除重複行


我們看到前面有兩行的內容是重複的,即Gentoo行,使用-u參數可以去掉重複的行:

sort

 

-u

 

test1

.txt



輸出結果如下:

Arch


CentOS
Debian 
Fedora
Gentoo
Kali
OpenSuse
redhat
ubuntu

在輸出結果中,重複的Gentoo行被去掉了。


按照數字排序


假設有文本內容test2.txt如下,第一列為市值排名,第二列為公司名稱,第三列為公司創建時間:

2 google 1998
10 icbc  1984
5 tencent 1998
1 apple 1976
16 samsung 1938

按照前面的介紹,我們對內容排序結果如下:

10 icbc  1984
16 samsung 1938
1 apple 1976
2 google 1998
5 tencent 1998

這不對啊,16怎麼在1前面呢?很顯然這是因為前面的排序都是字典排序,而我們實際需要的是按照數值大小進行排序,因此需要用到-n參數:

sort

 

-n

 

test2

.txt



最後的輸出結果如下:

1 apple 1976
2 google 1998
5 tencent 1998
10 icbc  1984
16 samsung 1938

可以看到,最終結果按照市值排名列印出來。

按照指定列排序


假如我們不想按照市值排名排序,而是按照公司名稱排序呢?那麼就需要按照指定列排序了。這裡需要用到兩個參數:




  • -t 指定分隔符,未指定時,默認分隔符為空白



  • -k 指定列排序


需要按照第二列,公司名稱排序,因此排序命令如下:

sort

 -k 

2

 test2.txt 

#默認以空白作為分隔符


sort

 -k 

2

 -t 

" "

 sort2.txt 

#以空格為分隔符



結果如下:

1 apple 1976
2 google 1998
10 icbc  1984
16 samsung 1938
5 tencent 1998

可以看到,最後會以第二列,即公司名稱為依據排序輸出。


以多列為依據排序


假設我們按照公司創建年份排序,如果年份相同,則按照公司名稱排序,即分別以第三列,第二列為依據排序:

sort

 

-n

 

-k

 3 

-k

 2 

test2

.txt



輸出結果如下:

16 samsung 1938
1 apple 1976
10 icbc  1984
2 google 1998
5 tencent 1998

如果要按照年份降序排序,則只需加-r參數即可:

sort

 

-n

 

-k

 3

r

 

-k

 2 

test2

.txt



輸出結果如下:

2 google 1998
5 tencent 1998
10 icbc  1984
1 apple 1976
16 samsung 1938

按照特定列的特定字元排序


假如我們想要按照公司名稱的第二至第三個字元排序,可以使用下面的方式:

sort

 -t 

" "

 -k 

2

.

2

,

2

.

3

 test2.txt

輸出結果如下:

16 samsung 1938
10 icbc  1984
5 tencent 1998
2 google 1998
1 apple 1976

-k 2.2,2.3指定了按照第二列排序,並且是第二列的第二個字元開始,到第三個字元結束。可以看到,由於samsung的第二個字母是a而排在開頭。如果是以第二個字元開始,到最後一個字元結束,則用下面的命令即可:

sort

 -t 

" "

 -k 

2

.

2

 test2.txt

保存排序結果


前面的排序命令僅僅是將排序結果列印到控制台,並沒有修改源文件,如果想要將排序結果保存在文件中,需要使用-o參數:

sort

 

test1

.txt

 

-o

 

test1

.txt

 #直接修改源文件

sort

 

test1

.txt

 

-o

 

output

.txt

 #輸出到另外一個文件

sort

 

test1

.txt

 > 

output

.txt

 #重定向到

output

.txt



如果想將排序結果保存在源文件中,只能使用-o參數,而如果是其他文件,既可以使用-o參數,也可以使用重定向。


檢查是否亂序


sort同樣也可以用來檢查文本內容是否已經是排好序的。
例如:

sort

 -c test1.txt 

#列印結果,並告知無序開始的行數


sort

 -C test1.txt 

#不列印結果,但是命令的返回結果為1



合併已排序的文本


可以使用-m選項來合併已經排好序的文本,但不會重新排序。
例如:

sort

 -m file1 file2

總結


以上就是使用sort命令對文本進行排序的常見使用方法,更多內容可使用man命令進行查看。常見選項如下:




  • -r 按照降序排列



  • -n 按照數值大小排列



  • -k 按照指定列排列



  • -t 指定分隔符



  • -u 去重



  • -o 輸出結果到文件中




 

 


●編號638,輸入編號直達本文



●輸入m獲取文章

目錄

推薦↓↓↓



運維


更多推薦

25個技術類公眾微信


涵蓋:程序人生、演算法與數據結構、黑客技術與網路安全、大數據技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Linux學習 的精彩文章:

Windows 現在擁有平台獨有的 Linux 發行版 — WLinux
Linux 內核版本那麼多,你應該選擇哪個穩定版本?

TAG:Linux學習 |