[Linux] Linux Sort Command Note

[Linux] Linux Sort Command Note

sort指令預設是根據英文字母的順序來進行每一行的排序,

sort也可以從標準輸入(standard input)接受資料,

cat linux.txt | sort

可以透過-f參數來進行大小寫的排序,通常這個參數會跟-u參數一起使用,把重複出現的資料刪掉,只留下一筆,

sort -fu test.txt

如果想讓sort反向排序的話,可以加上-r參數,

sort -r test.txt

因為sort預設是使用整行的文字來進行排序,如果每一行文字資料中,還有包含許多欄位的話(例如逗點分隔的CSV檔),我們也可以使用特定的欄位來做為排序的依據,在指定欄位之前,我們必須先使用-t參數指定欄位的分隔字元(預設為空白或Tab),將欄位正確切開,接著以-k參數指定欄位的編號。
以下我們以逗號分隔欄位,並使用第二欄數字的資料做為排序的依據,

sort -t, -k2,2 test.txt

-k參數在指定欄位時,輸入的兩個數字代表『起始位置』與『結束位置』,而如果將結束位置省略的話,預設的結束位置就是整行的結尾。由於這個例子只有兩個欄位,所以我們也可以把結束位置省略,寫成這樣:

sort -t, -k2 test.txt

不過 sort 在排序時,預設都是把資料當作文字來排序,所以上面的排序結果中,數字 1 開頭的會排在最前面,而數字 9 開頭的則會被放在最後。

如果想讓資料根據實際數值的大小來排序,可以加上 -n 參數:

sort -t, -k2 -n linux.txt

若想要對這種含有單位的數值做排序,可以使用 -h 參數:

sort -h unit.txt

若想依照月份排序,可以加上 -M 參數:

sort -M mon.txt

在比較複雜的資料中,我們可能會需要依據多個欄位進行排序,此時可以使用多組 -k 參數指定欄位,並加上每個欄位值的解析方式。
解析方式的指定,就是使用前面介紹的各種參數,例如 n 代表依照數值大小排序,M 則代表依照月份排序等,放在 -k 參數位置的這些解析方式只會對該欄位有影響,不會影響到其他的欄位。
下面這個範例是將 ls -l 的輸出交給 sort,先使用月份進行排序,若月份相同,則依照日的數值:

ls -l | sort -k6M,6 -k7n,7

這個例子只是用來示範 sort 多欄位的排序方法,如果真的要讓檔案依據時間排序,請使用:

ls -ltr

列出目前系統上最耗 CPU 的 3 個行程:

ps aux | sort -nrk 3,3 | head -n 3 | nl

Add a Comment