在命令行用 sort 進(jìn)行排序的方法
Linux sort命令用于將文本文件內(nèi)容加以排序。
sort可針對文本文件的內(nèi)容,以行為單位來排序。
在 Linux、BSD 或 Mac 的終端中使用 sort 命令,按自己的需求重新整理數(shù)據(jù)。
如果你曾經(jīng)用過數(shù)據(jù)表應(yīng)用程序,你就會知道可以按列的內(nèi)容對行進(jìn)行排序。例如,如果你有一個(gè)費(fèi)用列表,你可能希望對它們進(jìn)行按日期或價(jià)格升序抑或按類別進(jìn)行排序。如果你熟悉終端的使用,你不會僅為了排序文本數(shù)據(jù)就去使用龐大的辦公軟件。這正是 sort 命令的用處。
安裝
你不必安裝 sort ,因?yàn)樗騺矶及?POSIX 系統(tǒng)里。在大多數(shù) Linux 系統(tǒng)中,sort 命令來自 GNU 組織打包的實(shí)用工具集合中。在其他的 POSIX 系統(tǒng)中,像 BSD 和 Mac,默認(rèn)的 sort 命令不是 GNU 提供的,所以有一些選項(xiàng)可能不一樣。本文中我盡量對 GNU 和 BSD 兩者的實(shí)現(xiàn)都進(jìn)行說明。
按字母順序排列行
sort 命令默認(rèn)會讀取文件每行的第一個(gè)字符并對每行按字母升序排序后輸出。兩行中的第一個(gè)字符相同的情況下,對下一個(gè)字符進(jìn)行對比。例如:
$ 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 僅起到過濾的作用,所以如果你希望按排序后的格式保存數(shù)據(jù),你需要用 > 或 tee 進(jìn)行重定向。
$ sort distro.list | tee distro.sorted 1337 Arch Debian [...] $ cat distro.sorted 1337 Arch Debian [...]
按列排序
復(fù)雜數(shù)據(jù)集有時(shí)候不止需要對每行的第一個(gè)字符進(jìn)行排序。例如,假設(shè)有一個(gè)動物列表,每個(gè)都有其種和屬,用可預(yù)見的分隔符分隔每一個(gè)“字段”(即數(shù)據(jù)表中的“單元格”)。這類由數(shù)據(jù)表導(dǎo)出的格式很常見,CSV(以逗號分隔的數(shù)據(jù)comma-separated values)后綴可以標(biāo)識這些文件(雖然 CSV 文件不一定用逗號分隔,有分隔符的文件也不一定用 CSV 后綴)。以下數(shù)據(jù)作為示例:
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
對于這組示例數(shù)據(jù),你可以用 --field-separator (在 BSD 和 Mac 用 -t,在 GNU 上也可以用簡寫 -t )設(shè)置分隔符為分號(因?yàn)樵撌纠龜?shù)據(jù)中是用分號而不是逗號,理論上分隔符可以是任意字符),用 --key(在 BSD 和 Mac 上用 -k,在 GNU 上也可以用簡寫 -k)選項(xiàng)指定哪個(gè)字段被排序。例如,對每行第二個(gè)字段進(jìn)行排序(計(jì)數(shù)以 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
結(jié)果有點(diǎn)不容易讀,但是 Unix 以構(gòu)造命令的管道方式而聞名,所以你可以使用 column 命令美化輸出結(jié)果。使用 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
對于初學(xué)者可能有點(diǎn)不好理解(但是寫起來簡單),BSD 和 Mac 上的命令選項(xiàng):
$ 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
當(dāng)然 -k 不一定非要設(shè)為 2。任意存在的字段都可以被設(shè)為排序的鍵。
逆序排列
你可以用 --reverse(BSD/Mac 上用 -r,GNU 上也可以用簡寫 -r)選項(xiàng)來顛倒已經(jīng)排好序的列表。
$ sort --reverse alphabet.list z y x w [...]
你也可以把輸出結(jié)果通過管道傳給命令 tac 來實(shí)現(xiàn)相同的效果。
按月排序(僅 GNU 支持)
理想情況下,所有人都按照 ISO 8601 標(biāo)準(zhǔn)來寫日期:年、月、日。這是一種合乎邏輯的指定精確日期的方法,也可以很容易地被計(jì)算機(jī)理解。也有很多情況下,人類用其他的方式標(biāo)注日期,包括用很名字隨意的月份。
幸運(yùn)的是,GNU sort 命令能識別這種寫法,并可以按月份的名稱正確排序。使用 --month-sort(-M)選項(xiàng):
$ cat month.list November October September April [...] $ sort --month-sort month.list January February March April May [...] November December
月份的全稱和簡寫都可以被識別。
人類可讀的數(shù)字排序(僅 GNU 支持)
另一個(gè)人類和計(jì)算機(jī)的常見混淆點(diǎn)是數(shù)字的組合。例如,人類通常把 “1024 kilobytes” 寫成 “1KB”,因?yàn)槿祟惤馕?“1 KB” 比 “1024” 要容易且更快(數(shù)字越大,這種差異越明顯)。對于計(jì)算機(jī)來說,一個(gè) 9 KB 的字符串要比諸如 1 MB 的字符串大(盡管 9 KB 是 1 MB 很小一部分)。GNU sort 命令提供了--human-numeric-sort(-h)選項(xiàng)來幫助正確解析這些值。
$ 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
邏輯上來說,這個(gè)示例中 16000 應(yīng)該寫成 16 KB,所以也不應(yīng)該全部歸咎于GNU sort。只要你確保數(shù)字的一致性,--human-numeric-sort 可以用一種計(jì)算機(jī)友好的方式解析成人類可讀的數(shù)字。
隨機(jī)排序(僅 GNU 支持)
有時(shí)候工具也提供了一些與設(shè)計(jì)初衷相悖的選項(xiàng)。某種程度上說,sort 命令提供對一個(gè)文件進(jìn)行隨機(jī)排序的能力沒有任何意義。這個(gè)命令的工作流讓這個(gè)特性變得很方便。你可以用其他的命令,像 shuf ,或者你可以用現(xiàn)在的命令添加一個(gè)選項(xiàng)。不管你認(rèn)為它是一個(gè)臃腫的還是極具創(chuàng)造力的用戶體驗(yàn)設(shè)計(jì),GNU sort
命令提供了對文件進(jìn)行隨機(jī)排序的功能。
最純粹的隨機(jī)排序格式選項(xiàng)是 --random-sort
或 -R(不要跟 -r 混淆,-r 是 --reverse 的簡寫)。
$ sort --random-sort alphabet.list d m p a [...]
每次對文件運(yùn)行隨機(jī)排序都會有不同的結(jié)果。
結(jié)語
GNU 和 BSD 的 sort 命令還有很多功能,所以花點(diǎn)時(shí)間去了解這些選項(xiàng)。你會驚異于 sort 的靈活性,尤其是當(dāng)它和其他的 Unix 工具一起使用時(shí)。
總結(jié)
以上所述是小編給大家介紹的在命令行用 sort 進(jìn)行排序的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
Kali滲透測試之使用Metasploit對Web應(yīng)用的攻擊
這篇文章主要介紹了Kali滲透測試:使用Metasploit對Web應(yīng)用的攻擊,這種漏洞源于Web應(yīng)用程序沒有對用戶輸入的內(nèi)容進(jìn)行準(zhǔn)確的驗(yàn)證,從而導(dǎo)致操作系統(tǒng)執(zhí)行了攻擊者輸入的命令,需要的朋友可以參考下2022-05-05游戲開發(fā)進(jìn)階Unity網(wǎng)格(Mesh\動態(tài)合批\骨骼動畫\蒙皮)
本篇文章是進(jìn)階篇文章主要講解游戲開發(fā)進(jìn)階,主要包含的技術(shù)有Mesh,動態(tài)合批,骨骼動畫,蒙皮下面一起進(jìn)入U(xiǎn)nity網(wǎng)格探險(xiǎn)之旅吧2021-09-09web高性能開發(fā)系列隨筆 BearRui(AK-47)版
在BlogJava里寫了一些關(guān)于高性能WEB開發(fā)的隨筆,因?yàn)槎际歉岸思夹g(shù)相關(guān)(html,http,js,css等),大家可以參考下。非常值得參考。2010-05-05基于QGIS的研究區(qū)域遙感影像裁切下載方法(以岳麓區(qū)為例)
本文以湖南省長沙市岳麓區(qū)為例,主要講解如何基于QGIS這款軟件,把岳麓區(qū)范圍內(nèi)的遙感影像下載,并使用QGIS進(jìn)行切片,最后用Leaflet進(jìn)行展示的例子,對QGIS遙感影像裁切下載相關(guān)知識感興趣的朋友跟隨小編一起看看吧2024-05-05git通過內(nèi)網(wǎng)代理訪問外網(wǎng)的相關(guān)配置方法
這篇文章主要介紹了git通過內(nèi)網(wǎng)代理,訪問外網(wǎng)的相關(guān)配置,配置git代理以http代理為例,給大家詳細(xì)講解,需要的朋友可以參考下2023-05-05