成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在命令行用sort進行排序

系統 Linux
在 Linux、BSD 或 Mac 的終端中使用 sort 命令,按自己的需求重新整理數據。

[[284953]]

在 Linux、BSD 或 Mac 的終端中使用 sort 命令,按自己的需求重新整理數據。

如果你曾經用過數據表應用程序,你就會知道可以按列的內容對行進行排序。例如,如果你有一個費用列表,你可能希望對它們進行按日期或價格升序抑或按類別進行排序。如果你熟悉終端的使用,你不會僅為了排序文本數據就去使用龐大的辦公軟件。這正是 sort 命令的用處。

安裝

你不必安裝 sort ,因為它向來都包含在 POSIX 系統里。在大多數 Linux 系統中,sort 命令來自 GNU 組織打包的實用工具集合中。在其他的 POSIX 系統中,像 BSD 和 Mac,默認的 sort 命令不是 GNU 提供的,所以有一些選項可能不一樣。本文中我盡量對 GNU 和 BSD 兩者的實現都進行說明。

按字母順序排列行

sort 命令默認會讀取文件每行的第一個字符并對每行按字母升序排序后輸出。兩行中的第一個字符相同的情況下,對下一個字符進行對比。例如:

  1. $ cat distro.list
  2. Slackware
  3. Fedora
  4. Red Hat Enterprise Linux
  5. Ubuntu
  6. Arch
  7. 1337
  8. Mint
  9. Mageia
  10. Debian
  11. $ sort distro.list
  12. 1337
  13. Arch
  14. Debian
  15. Fedora
  16. Mageia
  17. Mint
  18. Red Hat Enterprise Linux
  19. Slackware
  20. Ubuntu

使用 sort 不會改變原文件。sort 僅起到過濾的作用,所以如果你希望按排序后的格式保存數據,你需要用 >tee 進行重定向。

  1. $ sort distro.list | tee distro.sorted
  2. 1337
  3. Arch
  4. Debian
  5. [...]
  6. $ cat distro.sorted
  7. 1337
  8. Arch
  9. Debian
  10. [...]

按列排序

復雜數據集有時候不止需要對每行的第一個字符進行排序。例如,假設有一個動物列表,每個都有其種和屬,用可預見的分隔符分隔每一個“字段”(即數據表中的“單元格”)。這類由數據表導出的格式很常見,CSV(以逗號分隔的數據comma-separated values)后綴可以標識這些文件(雖然 CSV 文件不一定用逗號分隔,有分隔符的文件也不一定用 CSV 后綴)。以下數據作為示例:

  1. Aptenodytes;forsteri;Miller,JF;1778;Emperor
  2. Pygoscelis;papua;Wagler;1832;Gentoo
  3. Eudyptula;minor;Bonaparte;1867;Little Blue
  4. Spheniscus;demersus;Brisson;1760;African
  5. Megadyptes;antipodes;Milne-Edwards;1880;Yellow-eyed
  6. Eudyptes;chrysocome;Viellot;1816;Southern Rockhopper
  7. Torvaldis;linux;Ewing,L;1996;Tux

對于這組示例數據,你可以用 --field-separator (在 BSD 和 Mac 用 -t,在 GNU 上也可以用簡寫 -t )設置分隔符為分號(因為該示例數據中是用分號而不是逗號,理論上分隔符可以是任意字符),用 --key(在 BSD 和 Mac 上用 -k,在 GNU 上也可以用簡寫 -k)選項指定哪個字段被排序。例如,對每行第二個字段進行排序(計數以 1 開頭而不是 0):

  1. sort --field-separator=";" --key=2
  2. Megadyptes;antipodes;Milne-Edwards;1880;Yellow-eyed
  3. Eudyptes;chrysocome;Viellot;1816;Sothern Rockhopper
  4. Spheniscus;demersus;Brisson;1760;African
  5. Aptenodytes;forsteri;Miller,JF;1778;Emperor
  6. Torvaldis;linux;Ewing,L;1996;Tux
  7. Eudyptula;minor;Bonaparte;1867;Little Blue
  8. Pygoscelis;papua;Wagler;1832;Gentoo

結果有點不容易讀,但是 Unix 以構造命令的管道方式而聞名,所以你可以使用 column 命令美化輸出結果。使用 GNU column

  1. $ sort --field-separator=";" \
  2. \--key=2 penguins.list | column --table --separator ";"
  3. Megadyptes   antipodes   Milne-Edwards  1880  Yellow-eyed
  4. Eudyptes     chrysocome  Viellot        1816  Southern Rockhopper
  5. Spheniscus   demersus    Brisson        1760  African
  6. Aptenodytes  forsteri    Miller,JF      1778  Emperor
  7. Torvaldis    linux       Ewing,L        1996  Tux
  8. Eudyptula    minor       Bonaparte      1867  Little Blue
  9. Pygoscelis   papua       Wagler         1832  Gentoo

對于初學者可能有點不好理解(但是寫起來簡單),BSD 和 Mac 上的命令選項:

  1. $ sort -t ";" \
  2. -k2 penguins.list | column -t -s ";"
  3. Megadyptes   antipodes   Milne-Edwards  1880  Yellow-eyed
  4. Eudyptes     chrysocome  Viellot        1816  Southern Rockhopper
  5. Spheniscus   demersus    Brisson        1760  African
  6. Aptenodytes  forsteri    Miller,JF      1778  Emperor
  7. Torvaldis    linux       Ewing,L        1996  Tux
  8. Eudyptula    minor       Bonaparte      1867  Little Blue
  9. Pygoscelis   papua       Wagler         1832  Gentoo

當然 -k 不一定非要設為 2。任意存在的字段都可以被設為排序的鍵。

逆序排列

你可以用 --reverse(BSD/Mac 上用 -r,GNU 上也可以用簡寫 -r)選項來顛倒已經排好序的列表。

  1. $ sort --reverse alphabet.list
  2. z
  3. y
  4. x
  5. w
  6. [...]

你也可以把輸出結果通過管道傳給命令 tac 來實現相同的效果。

按月排序(僅 GNU 支持)

理想情況下,所有人都按照 ISO 8601 標準來寫日期:年、月、日。這是一種合乎邏輯的指定精確日期的方法,也可以很容易地被計算機理解。也有很多情況下,人類用其他的方式標注日期,包括用很名字隨意的月份。

幸運的是,GNU sort 命令能識別這種寫法,并可以按月份的名稱正確排序。使用 --month-sort-M)選項:

  1. $ cat month.list
  2. November
  3. October
  4. September
  5. April
  6. [...]
  7. $ sort --month-sort month.list
  8. January
  9. February
  10. March
  11. April
  12. May
  13. [...]
  14. November
  15. December

月份的全稱和簡寫都可以被識別。

人類可讀的數字排序(僅 GNU 支持)

另一個人類和計算機的常見混淆點是數字的組合。例如,人類通常把 “1024 kilobytes” 寫成 “1KB”,因為人類解析 “1 KB” 比 “1024” 要容易且更快(數字越大,這種差異越明顯)。對于計算機來說,一個 9 KB 的字符串要比諸如 1 MB 的字符串大(盡管 9 KB 是 1 MB 很小一部分)。GNU sort 命令提供了--human-numeric-sort-h)選項來幫助正確解析這些值。

  1. $ cat sizes.list
  2. 2M
  3. 12MB
  4. 1k
  5. 9k
  6. 900
  7. 7000
  8. $ sort --human-numeric-sort
  9. 900
  10. 7000
  11. 1k
  12. 9k
  13. 2M
  14. 12MB

有一些情況例外。例如,“16000 bytes” 比 “1 KB” 大,但是 sort 識別不了。

  1. $ cat sizes0.list
  2. 2M
  3. 12MB
  4. 16000
  5. 1k
  6. $ sort -h sizes0.list
  7. 16000
  8. 1k
  9. 2M
  10. 12MB

邏輯上來說,這個示例中 16000 應該寫成 16 KB,所以也不應該全部歸咎于GNU sort。只要你確保數字的一致性,--human-numeric-sort 可以用一種計算機友好的方式解析成人類可讀的數字。

隨機排序(僅 GNU 支持)

有時候工具也提供了一些與設計初衷相悖的選項。某種程度上說,sort 命令提供對一個文件進行隨機排序的能力沒有任何意義。這個命令的工作流讓這個特性變得很方便。你可以用其他的命令,像 shuf ,或者你可以用現在的命令添加一個選項。不管你認為它是一個臃腫的還是極具創造力的用戶體驗設計,GNU sort 命令提供了對文件進行隨機排序的功能。

最純粹的隨機排序格式選項是 --random-sort-R(不要跟 -r 混淆,-r--reverse 的簡寫)。

  1. $ sort --random-sort alphabet.list
  2. d
  3. m
  4. p
  5. a
  6. [...]

每次對文件運行隨機排序都會有不同的結果。

結語

GNU 和 BSD 的 sort 命令還有很多功能,所以花點時間去了解這些選項。你會驚異于 sort 的靈活性,尤其是當它和其他的 Unix 工具一起使用時。 

 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2009-10-26 18:09:31

Oracle用戶解鎖

2014-02-12 10:11:08

掃描病毒掃描Clam Antivi

2018-12-12 09:44:07

Linux命令行時間管理

2010-05-31 11:42:32

MySQL基本命令

2021-01-14 08:47:55

Linux命令行打印

2023-03-28 08:40:22

命令行JSON用法

2022-02-08 13:24:49

LinuxLinux命令

2018-05-04 09:15:35

PythonPlumbum命令行

2016-03-28 10:00:09

Swift命令程序

2010-02-23 16:06:58

Python 命令行

2022-02-08 17:19:05

Linux命令grep

2021-07-15 13:32:12

Linux生成密碼

2021-07-15 13:25:43

LinuxPDF

2010-06-23 14:28:23

LINUX Bash

2021-08-10 09:07:28

命令行Linux發行版

2020-12-10 16:16:08

工具代碼開發

2020-12-11 06:44:16

命令行工具開發

2009-02-18 20:20:40

autojump更改目錄命令行下

2014-09-11 10:33:06

Linux

2009-05-30 09:26:38

AndroidGoogle移動OS
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区二区三区在线观看视频 | 久久久91精品国产一区二区三区 | 精产国产伦理一二三区 | 欧美黑人狂野猛交老妇 | 亚洲精品无 | 欧美一区二区免费在线 | 午夜精品久久 | 国产精品无码专区在线观看 | 天天操操| 欧美日韩电影一区二区 | 亚洲影音 | 一二三在线视频 | 国产一区免费 | 亚洲三级在线观看 | avhd101在线成人播放 | 欧美在线二区 | 韩日一区二区三区 | 免费看淫片| 九九综合 | 中文一区| 国产福利在线播放 | 国产精品3区 | 亚洲一区在线观看视频 | a国产一区二区免费入口 | 亚洲午夜精品视频 | 国产精品福利在线观看 | 国内自拍偷拍 | www.日本国产 | 国产精品欧美一区二区三区 | 天天操天天干天天爽 | 在线看亚洲 | 毛片黄片免费看 | 午夜欧美一区二区三区在线播放 | 黄色在线免费观看 | 天天看夜夜| 亚洲精品久久久一区二区三区 | 国产一级片一区二区三区 | 国产一区二区三区四区五区3d | 精品一区二区三区91 | 激情在线视频网站 | 超碰在线观看97 |