shell學習十八天 文字排序

2021-07-03 09:33:17 字數 3910 閱讀 2255

排序文字

行的排序,

使用的命令

sort,

該命令的語法是

: sort [option] [files...].sort

將檔案/

文字的每一行作為乙個單位,相互比較,比較原則是從首字元向後,依次按

ascii碼值進行比較,最後將他們按公升序輸出。

入門案例:

有乙個檔案

temp.txt,

內容為:

aaa:10:1.1ccc:30:3.3ddd:40:4.4bbb:20:2.2eee:50:5.5eee:50:5.5

使用 sort temp.txt

輸出結果為:

aaa:10:1.1bbb:20:2.2ccc:30:3.3ddd:40:4.4eee:50:5.5eee:50:5.5

再來看sort

的各個選項的使用:

-b:忽略每行前面開始處的空格字元;

-c:檢查檔案是否已經按照順序排序,排序過為真;

-d:排序時,處理英文本母、數字和空格字元,以字典順序排序。忽略其他所有字元;

-f:排序時,將小寫字母視為大寫字母;

-i:排序時,處理

040~176

之間的ascii

字元,忽略其他所有字元;

-m:將幾個排序好的檔案進行合併;

-m:將前面

3個字母按月份的縮寫進行排序;

-n:按照數值大小進行排序;

-o outfile.txt:將排序後的結果存入

outfile.txt;

-r:以相反的順序進行排序;

-k:指定需要排序的列數(欄數);

-t 分隔符:指定排序時所用到的字段分隔符;

+ 起始字段 

- 結束字段:以指定的字段來排序,範圍從起始欄位到結束欄位的前一欄位。(古老的用法)

案例:使用

-u選項的輸出

,還是針對檔案

temp.txt

aaa:10:1.1

bbb:20:2.2

ccc:30:3.3

ddd:40:4.4

eee:50:5.5

例如:有乙個檔案

sort.txt,

內容為:

aa:bb:cc

aaa:30:1.6

ccc:50:3.3

ddd:20:4.2

bbb:10:2.5

eee:40:5.4

eee:60:5.1

使用sort -nk 2 -t: sort.txt 排序後的結果為:

aa:bb:cc

bbb:10:2.5

ddd:20:4.2

aaa:30:1.6

eee:40:5.4

ccc:50:3.3

eee:60:5.1

上述命令的意思是說,

將第二列按照數字從小到大排列

使用sort -nrk 3 -t: sort.txt,該命令的意思是說

,將第三列數字從大到小排列

,所以輸出的結果為:

eee:40:5.4

eee:60:5.1

ddd:20:4.2

ccc:50:3.3

bbb:10:2.5

aaa:30:1.6

aa:bb:cc

備註: -n是按照數字大小排序,

-r是以相反順序,

-k是指定需要排序的字段,

-t指定字段分隔符為冒號.

問題:有乙個檔案

,內容為:

第一列表示水果名稱,

第二列表示水果數量

,第三列表式水果**

.我想按照水果的數量進行排序

,怎麼辦?

sort -nk 2 -t : fruit.txt(從小到大排序)

sort -nrk 2 -t : fruit.txt(從大到小排序

,注意選項的位置)

如果我想給/etc/passwd

按照第三行排序

,應該是這樣:

sort -t':' -k 3 /etc/passwd,但是細心的你一定會發現其中的問題

,貌似不對啊

?不應該啊

?那是因為

-k選項預設是按照字典數排列

,如果想按照數字排列需要指定

sort -t':' -k 3n /etc/passwd,

也就是需要加上

-n選項.

如果想逆序排列呢?

sort -t':' -k 3nr /etc/passwd

如果要對/etc/passwd

檔案中第六列的第二個字元到第四個字元正序排列

,再基於第一列進行反向排序.

sort -t':' -k 6.2,6.4 -k 1r /etc/passwd

引入乙個關於-k

選項的新知識.

-k選項的語法格式:

fstart.cstart modifie,fend.cend modifier-------start--------,-------end-------- fstart.cstart 選項  

,  fend.cend 選項

這個語法格式可以被其中的逗號(「,

」)分為兩大部分,

start

部分和end

部分。start

部分也由三部分組成,其中的

modifier

部分就是我們之前說過的類似n和

r的選項部分。我們重點說說

start

部分的fstart

和c.start

。c.start

也是可以省略的,省略的話就表示從本域的開頭部分開始。

fstart.cstart

,其中fstart

就是表示使用的域,而

cstart

則表示在

fstart

域中從第幾個字元開始算「排序首字元」。同理,在

end部分中,你可以設定

fend.cend

,如果你省略

.cend

,則表示結尾到「域尾」,即本域的最後乙個字元。或者,如果你將

cend

設定為0(零)

,也是表示結尾到「域尾」。

那麼很顯然 -k 6.2,6.4

的意思很明確

,第六個欄位的第二個字元到第六個欄位的第四個字元

.按照正序排列.

案例:檢視/etc/passwd

有多少個

shell:

對/etc/passwd

的第七個域進行排序,然後去掉重複的行:

cat /etc/passwd |  sort -t':' -k 7 -u

sort的行為模式

:它會讀取指定的檔案

,如果檔案未給出

,則讀取標準輸入

,再將排序好的資料寫至標準輸出.

總結:如果按照行排序,

使用-k 6;

按照字段排序,使用

-k 6.2 6.4

這樣的書寫格式

.欄位以及欄位裡的字元是有1開始

.如果進指定乙個字段編號

,則排序鍵值會自該字段的起始處開始

,一直繼續到記錄的結尾

(而非字段的結尾).

使用逗號(

或者空格

)隔開的字段

,是由逗號

(或者空格

)左邊開始,逗號

(或者空格

)右邊結束.例如

:-k 6.2, 6.4

表示從第六個欄位的第二個字元到第六個欄位的第四個字元.

當出現多個-k

選項的時候

,會先從第乙個鍵值字段開始排序

,找出匹配該鍵值的記錄後

,再進行第二個鍵值欄位的排序

,以此列推.

shell學習四十八天 檔案校驗和匹配

檔案校驗和匹配 要是你懷疑可能有很多檔案具有相同的內文,而是用cmp 或diff 進行比較所有橫隊的比較 導致所花費的時間會隨著檔案數目增長成次方的增長.這是可以使用file checksum 檔案校驗和 取得近似線性的效能 有很多任務具可用來計算檔案與字串的校驗和,包括 sum,cksum,以及c...

shell學習四十八天 檔案校驗和匹配

檔案校驗和匹配 要是你懷疑可能有非常多檔案具有同樣的內文,而是用cmp 或diff 進行比較全部橫隊的比較 導致所花費的時間會隨著檔案數目增長成次方的增長.這是能夠使用file checksum 檔案校驗和 取得近似線性的效能 有非常多工具可用來計算檔案與字串的校驗和,包含 sum,cksum,以及...

linuxC學習第十八天

int main int count 0 int length 0 int i,t 0 while 1 break case 3 刪除資訊 printf 刪除第幾個 n scanf d t for i t i length i length break default 無效的按鍵 printf 無效...