對文本文件中所有行進行排序。
sort [OPTION]... [FILE]...
sort [OPTION]... --files0-from=F
-
時,讀取標準輸入。排序選項:
-b, --ignore-leading-blanks 忽略開頭的空白。
-d, --dictionary-order 僅考慮空白、字母、數字。
-f, --ignore-case 將小寫字母作為大寫字母考慮。
-g, --general-numeric-sort 根據數字排序。
-i, --ignore-nonprinting 排除不可打印字符。
-M, --month-sort 按照非月份、一月、十二月的順序排序。
-h, --human-numeric-sort 根據存儲容量排序(注意使用大寫字母,例如:2K 1G)。
-n, --numeric-sort 根據數字排序。
-R, --random-sort 隨機排序,但分組相同的行。
--random-source=FILE 從FILE中獲取隨機長度的字節。
-r, --reverse 將結果倒序排列。
--sort=WORD 根據WORD排序,其中: general-numeric 等價于 -g,human-numeric 等價于 -h,month 等價于 -M,numeric 等價于 -n,random 等價于 -R,version 等價于 -V。
-V, --version-sort 文本中(版本)數字的自然排序。
其他選項:
--batch-size=NMERGE 一次合并最多NMERGE個輸入;超過部分使用臨時文件。
-c, --check, --check=diagnose-first 檢查輸入是否已排序,該操作不會執行排序。
-C, --check=quiet, --check=silent 類似于 -c 選項,但不輸出第一個未排序的行。
--compress-program=PROG 使用PROG壓縮臨時文件;使用PROG -d解壓縮。
--debug 注釋用于排序的行,發送可疑用法的警報到stderr。
--files0-from=F 從文件F中讀取以NUL結尾的所有文件名稱;如果F是 - ,那么從標準輸入中讀取名字。
-k, --key=KEYDEF 通過一個key排序;KEYDEF給出位置和類型。
-m, --merge 合并已排序文件,之后不再排序。
-o, --output=FILE 將結果寫入FILE而不是標準輸出。
-s, --stable 通過禁用最后的比較來穩定排序。
-S, --buffer-size=SIZE 使用SIZE作為內存緩存大小。
-t, --field-separator=SEP 使用SEP作為列的分隔符。
-T, --temporary-directory=DIR 使用DIR作為臨時目錄,而不是 $TMPDIR 或 /tmp;多次使用該選項指定多個臨時目錄。
--parallel=N 將并發運行的排序數更改為N。
-u, --unique 同時使用-c,嚴格檢查排序;不同時使用-c,輸出排序后去重的結果。
-z, --zero-terminated 設置行終止符為NUL(空),而不是換行符。
--help 顯示幫助信息并退出。
--version 顯示版本信息并退出。
KEYDEF的格式為:F[.C][OPTS][,F[.C][OPTS]] ,表示開始到結束的位置。
F表示列的編號
C表示
OPTS為[bdfgiMhnRrV]中的一到多個字符,用于覆蓋當前排序選項。
使用--debug選項可診斷出錯誤的用法。
SIZE 可以有以下的乘法后綴:
% 內存的1%;
b 1;
K 1024(默認);
剩余的 M, G, T, P, E, Z, Y 可以類推出來。
FILE(可選):要處理的文件,可以為任意數量。
返回0表示成功,返回非0值表示失敗。
sort將文件/文本的每一行作為一個單位相互比較,比較原則是從首字符向后依次按ASCII碼值進行比較,最后將他們按升序輸出。
root@[mail text]# cat sort.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
[root@mail text]# sort 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
忽略相同行使用-u
選項或者uniq
:
[root@mail text]# cat sort.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
[root@mail text]# sort -u sort.txt
aaa:10:1.1
bbb:20:2.2
ccc:30:3.3
ddd:40:4.4
eee:50:5.5
[root@mail text]# uniq sort.txt
aaa:10:1.1
ccc:30:3.3
ddd:40:4.4
bbb:20:2.2
eee:50:5.5
sort
的-n、-r、-k、-t
選項的使用:
[root@mail text]# cat sort.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
# 將BB列按照數字從小到大順序排列:
[root@mail text]# sort -nk 2 -t: sort.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
# 將CC列數字從大到小順序排列:
# -n是按照數字大小排序,-r是以相反順序,-k是指定需要排序的欄位,-t指定欄位分隔符為冒號
[root@mail text]# sort -nrk 3 -t: sort.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
關于-k
選項的解讀和例子:
-k選項深度解讀:
FStart.CStart Modifier,FEnd.CEnd Modifier
-------Start--------,-------End--------
FStart.CStart 選項 , FEnd.CEnd 選項
這個語法格式可以被其中的逗號,
分為兩大部分,Start 部分和 End 部分。
Start部分由三部分組成,其中的Modifier部分就是我們之前說過的選項部分;
我們重點說說Start
部分的FStart
和C.Start
;C.Start
是可以省略的,省略的話就表示從本域的開頭部分開始。FStart.CStart
,其中FStart
就是表示使用的域,而CStart
則表示在FStart
域中從第幾個字符開始算排序首字符。
同理,在End部分中,你可以設定FEnd.CEnd
,如果你省略.CEnd
或將它設定為0,則表示結尾到本域的最后一個字符。
例子:從公司英文名稱的第二個字母開始排序:
$ sort -t ' ' -k 1.2 facebook.txt
baidu 100 5000
sohu 100 4500
google 110 5000
guge 50 3000
解讀:使用了-k 1.2
,表示對第一個域的第二個字符開始到本域的最后一個字符為止的字符串進行排序。你會發現baidu因為第二個字母是a而名列榜首。sohu和google第二個字符都是o,但sohu的h在google的o前面,所以兩者分別排在第二和第三。guge只能屈居第四了。
例子:只針對公司英文名稱的第二個字母進行排序,如果相同的按照員工工資進行降序排序:
$ sort -t ' ' -k 1.2,1.2 -nrk 3,3 facebook.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個域開始到最后一個域位置的內容進行排序了。
關于這個復雜命令的學習,建議您閱讀info文檔及參考博客、問答網站等。
該命令是GNU coreutils
包中的命令,相關的幫助信息請查看man -s 1 shuf
,info coreutils 'shuf invocation'
。