【Linux】一步一步学Linux——sort命令(53)
00. 目錄
文章目錄
- 00. 目錄
- 01. 命令概述
- 02. 命令格式
- 03. 常用選項
- 04. 參考示例
- 05. 附錄
01. 命令概述
sort命令是在Linux里非常有用,它將文件進行排序,并將排序結果標準輸出。sort命令既可以從特定的文件,也可以從stdin中獲取輸入。
02. 命令格式
用法:sort [選項]... [文件]...03. 常用選項
長選項必須使用的參數對于短選項時也是必需使用的。 排序選項:-b, --ignore-leading-blanks 忽略前導的空白區域-d, --dictionary-order 只考慮空白區域和字母字符-f, --ignore-case 忽略字母大小寫-g, --general-numeric-sort 按照常規數值排序-i, --ignore-nonprinting 只排序可打印字符-M, --month-sort 比較 (未知) < "一月" < ... < "十二月"在LC_ALL=C 時為(unknown) < `JAN' < ... < `DEC'-h, --human-numeric-sort 使用易讀性數字(例如: 2K 1G)-n, --numeric-sort 根據字符串數值比較-R, --random-sort 根據隨機hash 排序--random-source=文件 從指定文件中獲得隨機字節-r, --reverse 逆序輸出排序結果--sort=WORD 按照WORD 指定的格式排序:一般數字-g,高可讀性-h,月份-M,數字-n,隨機-R,版本-V-V, --version-sort 在文本內進行自然版本排序其他選項:--batch-size=NMERGE 一次最多合并NMERGE 個輸入;如果輸入更多則使用臨時文件-c, --check, --check=diagnose-first 檢查輸入是否已排序,若已有序則不進行操作-C, --check=quiet, --check=silent 類似-c,但不報告第一個無序行--compress-program=程序 使用指定程序壓縮臨時文件;使用該程序的-d 參數解壓縮文件--debug 為用于排序的行添加注釋,并將有可能有問題的用法輸出到標準錯誤輸出--files0-from=文件 從指定文件讀取以NUL 終止的名稱,如果該文件被指定為"-"則從標準輸入讀文件名-k, --key=位置1[,位置2] 在位置1 開始一個key,在位置2 終止(默認為行尾)參看POS 語法。-m, --merge 合并已排序的文件,不再進行排序-o, --output=文件 將結果寫入到文件而非標準輸出-s, --stable 禁用last-resort 比較以穩定比較算法-S, --buffer-size=大小 指定主內存緩存大小-t, --field-separator=分隔符 使用指定的分隔符代替非空格到空格的轉換-T, --temporary-directory=目錄 使用指定目錄而非$TMPDIR 或/tmp 作為臨時目錄,可用多個選項指定多個目錄--parallel=N 將同時運行的排序數改變為N-u, --unique 配合-c,嚴格校驗排序;不配合-c,則只輸出一次排序結果-z, --zero-terminated 以0 字節而非新行作為行尾標志--help 顯示此幫助信息并退出--version 顯示版本信息并退出POS 是F[.C][OPTS],F 代表域編號,C 是域中字母的位置,F 和C 均從1開始計數 如果沒有有效的-t 或-b 選項存在,則從前導空格后開始計數字符。OPTS 是一個或多個 由單個字母表示的順序選項,以此覆蓋此key 的全局順序設置。如果沒有指定key 則 將其整個行。指定的大小可以使用以下單位之一: 內存使用率% 1%,b 1、K 1024 (默認),M、G、T、P、E、Z、Y 等依此類推。如果不指定文件,或者文件為"-",則從標準輸入讀取數據。04. 參考示例
4.1 將文本默認排序
sort將文件/文本的每一行作為一個單位,相互比較,比較原則是從首字符向后,依次按ASCII碼值進行比較,最后將他們按升序輸出。
[deng@localhost test]$ cat txt aaa:10:1.1 ccc:30:3.3 ddd:40:4.4 bbb:20:2.2 eee:50:5.5 eee:50:5.5 [deng@localhost test]$ sort txt aaa:10:1.1 bbb:20:2.2 ccc:30:3.3 ddd:40:4.4 eee:50:5.5 eee:50:5.5 [deng@localhost test]$4.2 忽略相同行
[deng@localhost test]$ sort -u txt aaa:10:1.1 bbb:20:2.2 ccc:30:3.3 ddd:40:4.4 eee:50:5.5 [deng@localhost test]$4.3 忽略每行前面開始出的空格字符
[deng@localhost test]$ sort -b txtaaa:10:1.1 bbb:20:2.2 ccc:30:3.3 ddd:40:4.4 eee:50:5.5 eee:50:5.5 [deng@localhost test]$4.4 檢查文件是否已經按照順序排序
[deng@localhost test]$ sort -c txt sort:txt:4:無序: bbb:20:2.2 [deng@localhost test]$4.5 將第2列按照數字從小到大順序排列
-n是按照數字大小排序,-r是以相反順序,-k是指定需要愛排序的欄位,-t指定欄位分隔符為冒號
[deng@localhost test]$ cat txt AAA: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 [deng@localhost test]$ sort -t: -nk 2 txt AAA: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 [deng@localhost test]$4.6 將第3列數字從大到小順序排列
-n是按照數字大小排序,-r是以相反順序,-k是指定需要愛排序的欄位,-t指定欄位分隔符為冒號
[deng@localhost test]$ sort -t: -n -r -k 3 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 AAA:BB:CC [deng@localhost test]$4.7 將排序結果輸出到源文件
[deng@localhost test]$ sort txt -o sort.txt [deng@localhost test]$ cat sort.txt aaa:30:1.6 AAA:BB:CC bbb:10:2.5 ccc:50:3.3 ddd:20:4.2 eee:40:5.4 eee:60:5.1 [deng@localhost test]$4.8 按照數值的大小排序
[deng@localhost test]$ cat txt 1 10 19 11 2 5//默認按照字符串排序的結果 [deng@localhost test]$ sort txt 1 10 11 19 2 5//按照數值大小排序結果 [deng@localhost test]$ sort -n txt 1 2 5 10 11 19 [deng@localhost test]$4.9 -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(零),也是表示結尾到“域尾”。
從公司英文名稱的第二個字母開始進行排序
[deng@localhost test]$ sort -t ' ' -k 1.2 txt baidu 100 5000 sohu 100 4500 google 110 5000 guge 50 3000 [deng@localhost test]$使用了-k 1.2,表示對第一個域的第二個字符開始到本域的最后一個字符為止的字符串進行排序。你會發現baidu因為第二個字母是a而名列榜首。sohu和 google第二個字符都是o,但sohu的h在google的o前面,所以兩者分別排在第二和第三。guge只能屈居第四了
只針對公司英文名稱的第二個字母進行排序,如果相同的按照員工工資進行降序排序
[deng@localhost test]$ sort -t: -k 1.2,1.2 -nrk 3,3 txt baidu 100 5000 google 110 5000 sohu 100 4500 guge 50 3000由于只對第二個字母進行排序,所以我們使用了-k 1.2,1.2的表示方式,表示我們“只”對第二個字母進行排序。(如果你問“我使用-k 1.2怎么不行?”,當然不行,因為你省略了End部分,這就意味著你將對從第二個字母起到本域最后一個字符為止的字符串進行排序)。對于員工工資進行排 序,我們也使用了-k 3,3,這是最準確的表述,表示我們“只”對本域進行排序,因為如果你省略了后面的3,就變成了我們“對第3個域開始到最后一個域位置的內容進行排序” 了。
4.10 sort其它選項
[deng@localhost test]$ cat txt google 110 5000 baidu 100 5000 guge 50 3000 sohu 100 4500 [deng@localhost test]$第一個域是公司名稱,第二個域是公司人數,第三個域是員工平均工資。
公司的字母順序排序
[deng@localhost test]$ sort -t ' ' -k 1 txt baidu 100 5000 google 110 5000 guge 50 3000 sohu 100 4500 [deng@localhost test]$按照公司人數排序
[deng@localhost test]$ sort -t ' ' -n -k 2 txt guge 50 3000 baidu 100 5000 sohu 100 4500 google 110 5000不用解釋,我相信你能懂。但是,此處出現了問題,那就是baidu和sohu的公司人數相同,都是100人,這個時候怎么辦呢?按照默認規矩,是從第一個域開始進行升序排序,因此baidu排在了sohu前面。
按照公司人數排序 ,人數相同的按照員工平均工資升序排序
[deng@localhost test]$ sort -t ' ' -n -k 2 -k 3 txt guge 50 3000 sohu 100 4500 baidu 100 5000 google 110 5000 [deng@localhost test]$看,我們加了一個-k2 -k3就解決了問題。對滴,sort支持這種設定,就是說設定域排序的優先級,先以第2個域進行排序,如果相同,再以第3個域進行排序。(如果你愿意,可以一直這么寫下去,設定很多個排序優先級)
按照員工工資降序排序,如果員工人數相同的,則按照公司人數升序排序
[deng@localhost test]$ sort -n -t ' ' -k 3r -k 2 txt baidu 100 5000 google 110 5000 sohu 100 4500 guge 50 3000 [deng@localhost test]$此處有使用了一些小技巧,你仔細看看,在-k 3后面偷偷加上了一個小寫字母r。揭曉:r和-r選項的作用是一樣的,就是表示逆序。因為sort默認是按照升序排序的,所以此處需要加上r表示第三個域(員工平均工資)是按照降序排序。此處你還可以加上n,就表示對這個域進行排序時,要按照數值大小進行排序,舉個例子吧:
[deng@localhost test]$ sort -t ' ' -k 3nr -k 2n txt baidu 100 5000 google 110 5000 sohu 100 4500 guge 50 3000 [deng@localhost test]$我們去掉了最前面的-n選項,而是將它加入到了每一個-k選項中了。
從公司英文名稱的第二個字母開始進行排序
[deng@localhost test]$ sort -t ' ' -k 1.2 txt baidu 100 5000 sohu 100 4500 google 110 5000 guge 50 3000 [deng@localhost test]$對公司英文名稱的第二個字母進行排序,如果相同的按照員工工資進行降序排序
[deng@localhost test]$ sort -t ' ' -k 1.2,1.2 -k 3,3nr txt baidu 100 5000 google 110 5000 sohu 100 4500 guge 50 3000 [deng@localhost test]$05. 附錄
參考:【Linux】一步一步學Linux系列教程匯總
總結
以上是生活随笔為你收集整理的【Linux】一步一步学Linux——sort命令(53)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux】一步一步学Linux——w
- 下一篇: 【Linux】一步一步学Linux——t