linux命令詳解:sort

very_on發表於2018-06-01

【sort 命令】

sort 命令常用於欄位排序。


【常用選項】

[html] view plain copy
  1. 用法:sort [選項]... [檔案]...  
  2.  或:sort [選項]... --files0-from=F  
  3. 串聯排序所有指定檔案並將結果寫到標準輸出。  
  4.   
  5. 長選項必須使用的引數對於短選項時也是必需使用的。  
  6. 排序選項:  
  7.   
  8.   -b, --ignore-leading-blanks   忽略前導的空白區域  
  9.   -d, --dictionary-order        只考慮空白區域和字母字元  
  10.   -f, --ignore-case             忽略字母大小寫  
  11.   -g, --general-numeric-sort    按照常規數值排序  
  12.   -i, --ignore-nonprinting      只排序可列印字元  
  13.   -M, --month-sort              比較 (未知) < "一月" < ... < "十二月"  
  14.                                 在LC_ALL=C 時為(unknown) < `JAN' < ... < `DEC'  
  15.   -h, --human-numeric-sort    使用易讀性數字(例如: 2K 1G)  
  16.   -n, --numeric-sort            根據字串數值比較  
  17.   -R, --random-sort             根據隨機hash 排序  
  18.       --random-source=檔案      從指定檔案中獲得隨機位元組  
  19.   -r, --reverse                 逆序輸出排序結果  
  20.       --sort=WORD               按照WORD 指定的格式排序:  
  21.                                         一般數字-g,高可讀性-h,月份-M,數字-n,  
  22.                                         隨機-R,版本-V  
  23.   -V, --version-sort            在文字內進行自然版本排序  
  24.   
  25. 其他選項:  
  26.   
  27.       --batch-size=NMERGE       一次最多合併NMERGE 個輸入;如果輸入更多  
  28.                                         則使用臨時檔案  
  29.   -c, --check, --check=diagnose-first   檢查輸入是否已排序,若已有序則不進行操作  
  30.   -C, --check=quiet--check=silent     類似-c,但不報告第一個無序行  
  31.       --compress-program=程式   使用指定程式壓縮臨時檔案;使用該程式  
  32.                                         的-d 引數解壓縮檔案  
  33.       --files0-from=檔案        從指定檔案讀取以NUL 終止的名稱,如果該檔案被  
  34.                                         指定為"-"則從標準輸入讀檔名  
  35.   -k, --key=位置1[,位置2]       在位置1 開始一個key,在位置2 終止(預設為行尾)  
  36.   -m, --merge                   合併已排序的檔案,不再進行排序  
  37.   -o, --output=檔案             將結果寫入到檔案而非標準輸出  
  38.   -s, --stable                  禁用last-resort 比較以穩定比較演算法  
  39.   -S, --buffer-size=大小        指定主記憶體快取大小  
  40.   -t, --field-separator=分隔符  使用指定的分隔符代替非空格到空格的轉換  
  41.   -T, --temporary-directory=目錄        使用指定目錄而非$TMPDIR 或/tmp 作為  
  42.                                         臨時目錄,可用多個選項指定多個目錄  
  43.   -u, --unique          配合-c,嚴格校驗排序;不配合-c,則只輸出一次排序結果  
  44.   -z, --zero-terminated 以0 位元組而非新行作為行尾標誌  
  45.       --help            顯示此幫助資訊並退出  
  46.       --version         顯示版本資訊並退出  
  47.   
  48. POS 是F[.C][OPTS],F 代表域編號,C 是域中字母的位置,F 和C 均從1開始計數  
  49. 如果沒有有效的-t 或-b 選項存在,則從前導空格後開始計數字符。OPTS 是一個或多個  
  50. 由單個字母表示的順序選項,以此覆蓋此key 的全域性順序設定。如果沒有指定key 則  
  51. 將其整個行。  
  52.   
  53. 指定的大小可以使用以下單位之一:  
  54. 記憶體使用率% 1%,b 1、K 1024 (預設),M、G、T、P、E、Z、Y 等依此類推。  
  55.   
  56. 如果不指定檔案,或者檔案為"-",則從標準輸入讀取資料。  

*** 警告 ***
本地環境變數會影響排序結果。
如果希望以位元組的自然值獲得最傳統的排序結果,請設定LC_ALL=C。


【使用說明】

1、sort 

比較原則是從首字元開始,依次按ASCII碼值進行比較,最後將比較結果按升序輸出。

建立一個測試檔案 test.txt,內容:

[html] view plain copy
  1. 6d7fce9fee471194aa8b5b6e47267f03  ./version.ini  
  2. 8c47b68c23994cf382bd12a3bd4a1fe8  ./plugin.conf  
  3. e45f64ed552ab0176be337ad77f3b3ae  ./start.sh  
  4. 6172fad14869bbb949ea1d60c4771f14  ./stop.sh  
  5. 8dd2db4b88727758bb0800c321bafc34  ./test_proc  
  6. 1e142f0d573c5891cc14d8864e073d53  ./test_proc.c  

執行命令sort 命令後,輸出為

[html] view plain copy
  1. # sort test.txt  
  2.   
  3. 1e142f0d573c5891cc14d8864e073d53  ./test_proc.c  
  4. 6172fad14869bbb949ea1d60c4771f14  ./stop.sh  
  5. 6d7fce9fee471194aa8b5b6e47267f03  ./version.ini  
  6. 8c47b68c23994cf382bd12a3bd4a1fe8  ./plugin.conf  
  7. 8dd2db4b88727758bb0800c321bafc34  ./test_proc  
  8. e45f64ed552ab0176be337ad77f3b3ae  ./start.sh  


2、-t 選項 和-k 選項 

[html] view plain copy
  1. # sort -k 2 -t "." test.txt  
  2.   
  3. 8c47b68c23994cf382bd12a3bd4a1fe8  ./plugin.conf  
  4. e45f64ed552ab0176be337ad77f3b3ae  ./start.sh  
  5. 6172fad14869bbb949ea1d60c4771f14  ./stop.sh  
  6. 8dd2db4b88727758bb0800c321bafc34  ./test_proc  
  7. 1e142f0d573c5891cc14d8864e073d53  ./test_proc.c  
  8. 6d7fce9fee471194aa8b5b6e47267f03  ./version.ini  

sort -k 2 -t "." test.txt,根據符號“.”分割字串,並以 分割後的test.txt 檔案中的第2列進行排序。


3、-n 選項 

10比2用 sort 命令排序的時候,可能會出現10比較小的情況。這是因為排序程式將數字按字元來排序,排序程式會先比較1和2,顯然1小,所以就將10放在2前面。這也是sort的一貫作風。 如果要改變這種排序方式,就要使用-n選項,指定以數值來排序。


4、-r 選項 

sort預設的排序方式是升序,如果想改成降序

[html] view plain copy
  1. ]# sort -r -k 2 -t "." test.txt  
  2. 6d7fce9fee471194aa8b5b6e47267f03  ./version.ini  
  3. 1e142f0d573c5891cc14d8864e073d53  ./test_proc.c  
  4. 8dd2db4b88727758bb0800c321bafc34  ./test_proc  
  5. 6172fad14869bbb949ea1d60c4771f14  ./stop.sh  
  6. e45f64ed552ab0176be337ad77f3b3ae  ./start.sh  
  7. 8c47b68c23994cf382bd12a3bd4a1fe8  ./plugin.conf  


5、-o 選項 

[html] view plain copy
  1. # sort -r -k 2 -t "." test.txt -o test.txt  
  2. # cat test.txt  
  3. 6d7fce9fee471194aa8b5b6e47267f03  ./version.ini  
  4. 1e142f0d573c5891cc14d8864e073d53  ./test_proc.c  
  5. 8dd2db4b88727758bb0800c321bafc34  ./test_proc  
  6. 6172fad14869bbb949ea1d60c4771f14  ./stop.sh  
  7. e45f64ed552ab0176be337ad77f3b3ae  ./start.sh  
  8. 8c47b68c23994cf382bd12a3bd4a1fe8  ./plugin.conf  


6、-f 選項 


將小寫字母都轉換為大寫字母來進行比較,即忽略大小寫 

在一個專案中,有過類似的經歷:使用 php 的 exec() 函式執行命令:sort  -k 2 -t"."   結果是:

[html] view plain copy
  1. 6d7fce9fee471194aa8b5b6e47267f03  ./VERSION.ini  
  2. 8c47b68c23994cf382bd12a3bd4a1fe8  ./plugin.conf  
  3. e45f64ed552ab0176be337ad77f3b3ae  ./start.sh  
  4. 6172fad14869bbb949ea1d60c4771f14  ./stop.sh  
  5. 8dd2db4b88727758bb0800c321bafc34  ./test_proc  
  6. 1e142f0d573c5891cc14d8864e073d53  ./test_proc.c  

但是在Linux中執行同樣的命令,結果則是如同加上f 選項


[html] view plain copy
  1. # sort -f -k 2 -t"." test.txt  
  2.   
  3. 8c47b68c23994cf382bd12a3bd4a1fe8  ./plugin.conf  
  4. e45f64ed552ab0176be337ad77f3b3ae  ./start.sh  
  5. 6172fad14869bbb949ea1d60c4771f14  ./stop.sh  
  6. 8dd2db4b88727758bb0800c321bafc34  ./test_proc  
  7. 1e142f0d573c5891cc14d8864e073d53  ./test_proc.c  
  8. 6d7fce9fee471194aa8b5b6e47267f03  ./VERSION.ini  

解決方法可以在php 中,使用 exec() 函式執行命令:sort  -f -k 2 -t"." 。

繼續探討上面的問題,懷疑是跟本地環境變數或者編碼存在關係,測試一下:

[html] view plain copy
  1. ~$ locale  
  2. LANG=en_US.UTF-8  
  3. LANGUAGE=en_US:  
  4. LC_CTYPE="en_US.UTF-8"  
  5. LC_NUMERIC="en_US.UTF-8"  
  6. LC_TIME="en_US.UTF-8"  
  7. LC_COLLATE="en_US.UTF-8"  
  8. LC_MONETARY="en_US.UTF-8"  
  9. LC_MESSAGES="en_US.UTF-8"  
  10. LC_PAPER="en_US.UTF-8"  
  11. LC_NAME="en_US.UTF-8"  
  12. LC_ADDRESS="en_US.UTF-8"  
  13. LC_TELEPHONE="en_US.UTF-8"  
  14. LC_MEASUREMENT="en_US.UTF-8"  
  15. LC_IDENTIFICATION="en_US.UTF-8"  
  16. LC_ALL=  

[html] view plain copy
  1. ~$ sort -k 2 -t"." test.txt  
  2. 8c47b68c23994cf382bd12a3bd4a1fe8  ./plugin.conf  
  3. e45f64ed552ab0176be337ad77f3b3ae  ./start.sh  
  4. 6172fad14869bbb949ea1d60c4771f14  ./stop.sh  
  5. 8dd2db4b88727758bb0800c321bafc34  ./test_proc  
  6. 1e142f0d573c5891cc14d8864e073d53  ./test_proc.c  
  7. 6d7fce9fee471194aa8b5b6e47267f03  ./VERSION.ini  

修改一下編碼方式

[html] view plain copy
  1. ~$ export LC_ALL=zh_CN.UTF-8  
  2.   
  3. :~$ locale  
  4. LANG=en_US.UTF-8  
  5. LANGUAGE=en_US:  
  6. LC_CTYPE="zh_CN.UTF-8"  
  7. LC_NUMERIC="zh_CN.UTF-8"  
  8. LC_TIME="zh_CN.UTF-8"  
  9. LC_COLLATE="zh_CN.UTF-8"  
  10. LC_MONETARY="zh_CN.UTF-8"  
  11. LC_MESSAGES="zh_CN.UTF-8"  
  12. LC_PAPER="zh_CN.UTF-8"  
  13. LC_NAME="zh_CN.UTF-8"  
  14. LC_ADDRESS="zh_CN.UTF-8"  
  15. LC_TELEPHONE="zh_CN.UTF-8"  
  16. LC_MEASUREMENT="zh_CN.UTF-8"  
  17. LC_IDENTIFICATION="zh_CN.UTF-8"  
  18. LC_ALL=zh_CN.UTF-8  
  19.   
  20. ~$ sort -k 2 -t"." test.txt  
  21. 6d7fce9fee471194aa8b5b6e47267f03  ./VERSION.ini  
  22. 8c47b68c23994cf382bd12a3bd4a1fe8  ./plugin.conf  
  23. e45f64ed552ab0176be337ad77f3b3ae  ./start.sh  
  24. 6172fad14869bbb949ea1d60c4771f14  ./stop.sh  
  25. 8dd2db4b88727758bb0800c321bafc34  ./test_proc  
  26. 1e142f0d573c5891cc14d8864e073d53  ./test_proc.c  

可見本地環境變數中指定的編碼方式確實對 sort 結果存在影響。至於php為什麼會出現這種問題,將繼續探究......



7、-c 選項 

使用-r選項例子中執行後的檔案

[html] view plain copy
  1. # cat test.txt  
  2. 6d7fce9fee471194aa8b5b6e47267f03  ./version.ini  
  3. 1e142f0d573c5891cc14d8864e073d53  ./test_proc.c  
  4. 8dd2db4b88727758bb0800c321bafc34  ./test_proc  
  5. 6172fad14869bbb949ea1d60c4771f14  ./stop.sh  
  6. e45f64ed552ab0176be337ad77f3b3ae  ./start.sh  
  7. 8c47b68c23994cf382bd12a3bd4a1fe8  ./plugin.conf  


[html] view plain copy
  1. # sort -c test.txt  
  2. sort:test.txt:2:無序: 1e142f0d573c5891cc14d8864e073d53  ./test_proc.c  

檢查到檔案亂序,輸出第一個亂序的行的相關資訊,並返回1  


8、-C 選項 

檢查檔案是否已排好序,如果是亂序則不輸出內容,僅是返回1  


版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/liuruiqun/article/details/52279098
個人分類: Linux
想對作者說點什麼? 我來說一句