在命令列用 sort 進行排序
在 Linux、BSD 或 Mac 的終端中使用 sort 命令,按自己的需求重新整理資料。
如果你曾經用過資料表應用程式,你就會知道可以按列的內容對行進行排序。例如,如果你有一個費用列表,你可能希望對它們進行按日期或價格升序抑或按類別進行排序。如果你熟悉終端的使用,你不會僅為了排序文字資料就去使用龐大的辦公軟體。這正是 sort 命令的用處。
安裝
你不必安裝 sort
,因為它向來都包含在 POSIX 系統裡。在大多數 Linux 系統中,sort
命令來自 GNU 組織打包的實用工具集合中。在其他的 POSIX 系統中,像 BSD 和 Mac,預設的 sort
命令不是 GNU 提供的,所以有一些選項可能不一樣。本文中我儘量對 GNU 和 BSD 兩者的實現都進行說明。
按字母順序排列行
sort
命令預設會讀取檔案每行的第一個字元並對每行按字母升序排序後輸出。兩行中的第一個字元相同的情況下,對下一個字元進行對比。例如:
$ cat distro.list
Slackware
Fedora
Red Hat Enterprise Linux
Ubuntu
Arch
1337
Mint
Mageia
Debian
$ sort distro.list
1337
Arch
Debian
Fedora
Mageia
Mint
Red Hat Enterprise Linux
Slackware
Ubuntu
使用 sort
不會改變原檔案。sort
僅起到過濾的作用,所以如果你希望按排序後的格式儲存資料,你需要用 >
或 tee
進行重定向。
$ sort distro.list | tee distro.sorted
1337
Arch
Debian
[...]
$ cat distro.sorted
1337
Arch
Debian
[...]
按列排序
複雜資料集有時候不止需要對每行的第一個字元進行排序。例如,假設有一個動物列表,每個都有其種和屬,用可預見的分隔符分隔每一個“欄位”(即資料表中的“單元格”)。這類由資料表匯出的格式很常見,CSV(以逗號分隔的資料comma-separated values)字尾可以標識這些檔案(雖然 CSV 檔案不一定用逗號分隔,有分隔符的檔案也不一定用 CSV 字尾)。以下資料作為示例:
Aptenodytes;forsteri;Miller,JF;1778;Emperor
Pygoscelis;papua;Wagler;1832;Gentoo
Eudyptula;minor;Bonaparte;1867;Little Blue
Spheniscus;demersus;Brisson;1760;African
Megadyptes;antipodes;Milne-Edwards;1880;Yellow-eyed
Eudyptes;chrysocome;Viellot;1816;Southern Rockhopper
Torvaldis;linux;Ewing,L;1996;Tux
對於這組示例資料,你可以用 --field-separator
(在 BSD 和 Mac 用 -t
,在 GNU 上也可以用簡寫 -t
)設定分隔符為分號(因為該示例資料中是用分號而不是逗號,理論上分隔符可以是任意字元),用 --key
(在 BSD 和 Mac 上用 -k
,在 GNU 上也可以用簡寫 -k
)選項指定哪個欄位被排序。例如,對每行第二個欄位進行排序(計數以 1 開頭而不是 0):
sort --field-separator=";" --key=2
Megadyptes;antipodes;Milne-Edwards;1880;Yellow-eyed
Eudyptes;chrysocome;Viellot;1816;Sothern Rockhopper
Spheniscus;demersus;Brisson;1760;African
Aptenodytes;forsteri;Miller,JF;1778;Emperor
Torvaldis;linux;Ewing,L;1996;Tux
Eudyptula;minor;Bonaparte;1867;Little Blue
Pygoscelis;papua;Wagler;1832;Gentoo
結果有點不容易讀,但是 Unix 以構造命令的管道方式而聞名,所以你可以使用 column
命令美化輸出結果。使用 GNU column
:
$ sort --field-separator=";" \
\--key=2 penguins.list | column --table --separator ";"
Megadyptes antipodes Milne-Edwards 1880 Yellow-eyed
Eudyptes chrysocome Viellot 1816 Southern Rockhopper
Spheniscus demersus Brisson 1760 African
Aptenodytes forsteri Miller,JF 1778 Emperor
Torvaldis linux Ewing,L 1996 Tux
Eudyptula minor Bonaparte 1867 Little Blue
Pygoscelis papua Wagler 1832 Gentoo
對於初學者可能有點不好理解(但是寫起來簡單),BSD 和 Mac 上的命令選項:
$ sort -t ";" \
-k2 penguins.list | column -t -s ";"
Megadyptes antipodes Milne-Edwards 1880 Yellow-eyed
Eudyptes chrysocome Viellot 1816 Southern Rockhopper
Spheniscus demersus Brisson 1760 African
Aptenodytes forsteri Miller,JF 1778 Emperor
Torvaldis linux Ewing,L 1996 Tux
Eudyptula minor Bonaparte 1867 Little Blue
Pygoscelis papua Wagler 1832 Gentoo
當然 -k
不一定非要設為 2
。任意存在的欄位都可以被設為排序的鍵。
逆序排列
你可以用 --reverse
(BSD/Mac 上用 -r
,GNU 上也可以用簡寫 -r
)選項來顛倒已經排好序的列表。
$ sort --reverse alphabet.list
z
y
x
w
[...]
你也可以把輸出結果通過管道傳給命令 tac 來實現相同的效果。
按月排序(僅 GNU 支援)
理想情況下,所有人都按照 ISO 8601 標準來寫日期:年、月、日。這是一種合乎邏輯的指定精確日期的方法,也可以很容易地被計算機理解。也有很多情況下,人類用其他的方式標註日期,包括用很名字隨意的月份。
幸運的是,GNU sort
命令能識別這種寫法,並可以按月份的名稱正確排序。使用 --month-sort
(-M
)選項:
$ cat month.list
November
October
September
April
[...]
$ sort --month-sort month.list
January
February
March
April
May
[...]
November
December
月份的全稱和簡寫都可以被識別。
人類可讀的數字排序(僅 GNU 支援)
另一個人類和計算機的常見混淆點是數字的組合。例如,人類通常把 “1024 kilobytes” 寫成 “1KB”,因為人類解析 “1 KB” 比 “1024” 要容易且更快(數字越大,這種差異越明顯)。對於計算機來說,一個 9 KB 的字串要比諸如 1 MB 的字串大(儘管 9 KB 是 1 MB 很小一部分)。GNU sort
命令提供了--human-numeric-sort
(-h
)選項來幫助正確解析這些值。
$ cat sizes.list
2M
12MB
1k
9k
900
7000
$ sort --human-numeric-sort
900
7000
1k
9k
2M
12MB
有一些情況例外。例如,“16000 bytes” 比 “1 KB” 大,但是 sort
識別不了。
$ cat sizes0.list
2M
12MB
16000
1k
$ sort -h sizes0.list
16000
1k
2M
12MB
邏輯上來說,這個示例中 16000 應該寫成 16 KB,所以也不應該全部歸咎於GNU sort
。只要你確保數字的一致性,--human-numeric-sort
可以用一種計算機友好的方式解析成人類可讀的數字。
隨機排序(僅 GNU 支援)
有時候工具也提供了一些與設計初衷相悖的選項。某種程度上說,sort
命令提供對一個檔案進行隨機排序的能力沒有任何意義。這個命令的工作流讓這個特性變得很方便。你可以用其他的命令,像 shuf ,或者你可以用現在的命令新增一個選項。不管你認為它是一個臃腫的還是極具創造力的使用者體驗設計,GNU sort
命令提供了對檔案進行隨機排序的功能。
最純粹的隨機排序格式選項是 --random-sort
或 -R
(不要跟 -r
混淆,-r
是 --reverse
的簡寫)。
$ sort --random-sort alphabet.list
d
m
p
a
[...]
每次對檔案執行隨機排序都會有不同的結果。
結語
GNU 和 BSD 的 sort
命令還有很多功能,所以花點時間去了解這些選項。你會驚異於 sort
的靈活性,尤其是當它和其他的 Unix 工具一起使用時。
via: https://opensource.com/article/19/10/get-sorted-sort
作者:Seth Kenlon 選題:lujun9972 譯者:lxbwolf 校對:wxy
訂閱“Linux 中國”官方小程式來檢視
相關文章
- JavaScript 使用sort()方法從數值上對陣列進行排序JavaScript陣列排序
- linux sort 多列正排序,倒排序Linux排序
- python用List的內建函式list.sort進行排序Python函式排序
- 《shell下sort排序命令的使用》排序
- 陣列進行排序的方法陣列排序
- 【LeetCode】Sort Colors 陣列排序LeetCode陣列排序
- Javascript陣列排序sort方法和自定義排序方法JavaScript陣列排序
- 用java.util.Collections中的sort方法對兩個類的物件進行排序Java物件排序
- 排序sort排序
- sort排序排序
- 在ListCtrl中進行排序 (轉)排序
- 在Linux命令列中進行大小寫字元轉換Linux命令列字元
- 根據陣列中物件進行排序陣列物件排序
- 一個命令對文字進行高效排序排序
- List排序用Collections.sort and Comparator排序
- 用c#進行快速排序C#排序
- JavaScript中陣列Array.sort()排序方法詳解JavaScript陣列排序
- js中陣列(Array)的排序(sort)注意事項JS陣列排序
- 使用 getopt() 進行命令列處理命令列
- 隨機錯亂排序(sort的應用)隨機排序
- Collections sort()排序方法排序
- 堆排序 Heap Sort排序
- Elasticsearch script sort 排序Elasticsearch排序
- 桶排序bucket sort排序
- 快速排序(Quick Sort)排序UI
- 希爾排序(Shell Sort)排序
- 快速排序 (Quick Sort)排序UI
- sort命令
- [CareerCup] 11.2 Sort Anagrams Array 異位詞陣列排序陣列排序
- 關於js陣列方法sort()負數排序的陷阱JS陣列排序
- 多維陣列按鍵名進行重新排序陣列排序
- 二維陣列根據欄位進行排序陣列排序
- Arr::sort()輔助函式對多維陣列的排序函式陣列排序
- 氣泡排序 bubble sort排序
- Lucene 排序 Sort與SortField排序
- [Shell] Sort排序的例子排序
- 二維陣列根據鍵的值進行排序陣列排序
- 使用oracle decode對錶字元列進行order by 排序Oracle字元排序