乙個命令對文字進行高效排序

2021-09-02 19:45:58 字數 3370 閱讀 2032

在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行被去掉了。

按照數字排序

2 google 1998

10 icbc 1984

5 tencent 1998

16 samsung 1938

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

10 icbc 1984

16 samsung 1938

2 google 1998

5 tencent 1998

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

sort -n test2.txt

最後的輸出結果如下:

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 #以空格為分隔符

結果如下:

2 google 1998

10 icbc 1984

16 samsung 1938

5 tencent 1998

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

以多列為依據排序

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

sort -n -k 3 -k 2 test2.txt
輸出結果如下:

16 samsung 1938

10 icbc 1984

2 google 1998

5 tencent 1998

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

sort -n -k 3r -k 2 test2.txt
輸出結果如下:

2 google 1998

5 tencent 1998

10 icbc 1984

16 samsung 1938

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

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

sort -t ' ' -k 2.2,2.3 test2.txt
輸出結果如下:

16 samsung 1938

10 icbc 1984

5 tencent 1998

2 google 1998

-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
-r 按照降序排列

-n 按照數值大小排列

-k 按照指定列排列

-t 指定分隔符

-u 去重

-o 輸出結果到檔案中

按字母順序對文字行進行排序

指標陣列的應用 include include define maxlines 5000 char lineptr maxlines char linestor int readlines char lineptr,int maxlines void writelines char lineptr,...

js對文字進行編碼涉及3個函式

js對文字進行編碼涉及3個函式 escape,encodeuri,encodeuricomponent,相應3個解碼函式 unescape,decodeuri,decodeuricomponent 1 傳遞引數時需要使用encodeuricomponent,這樣組合的url才不會被 等特殊字元截斷。...

如何根據乙個絕對檔案路徑生成乙個相對檔案路徑

日常的開發中,獲取絕對檔案路徑才是主流吧!連path.getfullpath這種生成絕對路徑的方法都已經成為 net standard 的一部分了。然而,生成相對路徑依然有用 比如你的配置檔案是相對於工作目錄的,必須這個路徑是輸出給使用者看的 那麼,既然path沒有生成相對路徑的方法,還能怎麼生成相...