sort 學習筆記

1  . sort 命令簡介
1)  sort 對一個或多個文件中或者來自標準輸入的行進行排序 , 比較 ,合併操作 .
2)  輸入:文件的內容 或者標準輸入 ,當文件名字未給出或者給出的文件名爲 - 時 ,sort 從標準輸入獲得輸入數據
3)  輸出:默認輸出到標準輸出 ,當然,可以將其重導向.

2  . sort 的語法格式
sort [OPTION]...[FILE]...

3  . sort 的三種操作模式
1)  sort 模式(默認)
2)  merge 模式(與選項-m有關)
3)  check 模式(check for sortedness)

4  . sort 的三種操作模式詳解
1)  sort 模式
--功能.對單一文件按照options指定的規則進行排序
--進入方法. 默認選擇,即如果沒有指定-c -C -m 選項,則進入該模式
2)  merge 模式
--功能:將多個已排序的文件合併爲一個大的已排序文件
--進入方法. -m 選項.
3)  check 模式
--進入方法 . -c 或 -C 選項
--限制 . 只能輸入一個文件
--功能 . -c 選項下,對於非完全有序(full sorted)的文件,給出一個包含第一個失序行(the first out-of-order line)的診斷(diagnostic),並以狀態1退出(exit with a status of 1);否則,成功退出(exit successfully),以狀態0. -C 選項與-c類似,但是不給出診斷信息.
--補充 . -C 即 --check=silent 或者 --check=quiet ;-c 即 --check=diagnose-first . 

4  . sort 的退出狀態
0   如果沒有任何錯誤
1   如果調用sort時使用了-c 或者 -C 選項,並且該文件不是有序的(not sorted)
2   如果發生了錯誤

5  . sort 的行比較機制
1)  每一行稱爲一個記錄(record) ,每個記錄被分隔符(field seperator)劃分成不同的域(field)
2)  sort 命令行(command line)通常會指定一些域作爲排序鍵,這些鍵越早聲明越先比較
3)  sort 命令比較兩個行時,會先按第一個鍵比較,如果出現鍵值相同的行,則那兩行按第二個鍵比較,直到分出大小或者所有指定的鍵都比完了.
4)  如果所有鍵值都比完了仍然無法分出兩行的大小,則sort命令默認會執行一個最後重新排序操作(last-resort comparison),即直接把整行當成鍵,比較該鍵大小以分出大小.
5) last-resort comparison 操作可以使用選項(option) --stable 即-s 廢止last-resort comparision . --unique 即 -u 也會廢止last-resort 操作.(-s 與 -u請參考下面的論述)
6)  當然,如果sort命令行沒有指定排序鍵,則默認以整行作爲鍵

6  . sort 的選項機制
1)  影響
sort的選項將影響輸出的內容
2)  定義方式
--在-k 指定的排序鍵之後指定,該選項只在該鍵內有效. -k 選項下有詳解.
--即不是在-k 指定的鍵中指定的選項. 具有全局作用. 如果未指定任何排序鍵,則全局選項將被用於比較;否則,全局選項將被那些沒有指定選項的鍵所繼承.
3)  關係
--位置不同,一個在-k之後的鍵中定義,一個不在
--作用範圍不同,一個局部作用,一個全局作用
--書寫形式不同,一個不需要前導-,一個需要
 
6  . -t SEPARATOR (--field-separator=SEPARATOR)
1)  以字符SEPARATOR作爲分隔各個域(field)的分隔符.
2)  默認情況下,sort以一個非空字符(a non-blank character)和一個空字符(a blank character)之間的空串(null string)作爲域分隔符(field separator),默認情況下空字符包含一個空格或者一個tab鍵. e.g., 字符串"    fst snd " 將被劃分成三部分,"    fst" 還有" snd" 以及" ".
3)  應該十分注意,默認情況下域分隔符的定義是非空字符與空字符之間的空串,而不是空字符與非空字符之間的空串.
4)  另外, 域分隔符既不屬於左邊的域也不屬於右邊的域,e.g. , sort -t ' '對行" fst snd"進行域劃分 ,該串將被分成三個域, 從左往右依次是, 空串,"fst" , "snd" .
5)  如果想把ASCII字符NUL指定爲域分隔符,則使用兩字符的字符串 '/0' ,例如 , sort -t '/0' 

7  . -k POS1[,POS2] (--key=POS1[,POS2])
1)  POS1和POS2分別指出鍵的起始和終止位置. 如果沒有指出POS2 ,則默認POS2爲行尾.
2)  POS格式F[.C][OPTS] .F是域編號,C是字符編號,域和字符編號都從1開始 F.C表示第F個域的第C個字符.(OPTS也影響字符的定位)
3)  如果POS1未指定C ,則默認爲1;如果POS2未指定C,則默認爲0(1代表域第一個字符,0代表最後一個)
4)  OPTS 選項可以是字母Mbdfinr中的0個或多個
n   該鍵作爲數字進行比較
r   該鍵按逆序(reverse)排序(從大到小)
f   該鍵比較過程中忽略大小寫(fold lowercase characters into the equivalent uppercase characters when comparing)
b   按該鍵比較時忽略鍵值的前導空白符(blank character , 默認含空格和tab鍵,參考下面的 -b 選項,其中有重要信息)
i   按該鍵比較時忽略鍵值的不可打印字符(/a報警 /b退格 /n換行 /r回車等),即只按照可打印字符排序.
d   按該鍵比較時使用字典序排序(字典須只考慮空白和字母,忽略其它)
M   參照如下的 -M 選項

8  .-b (--ignore-leading-blanks)
1)  忽略前導的空白符
2)  -b 選項作爲全局選項時,可以被那些沒有指定自己的選項的排序鍵繼承,b會被添加到排序鍵的起始和終止位置之後.即 sort -b -k2,2 相當於sort -k 2b,2b .
3)  需要注意的是,在起始位置的b隻影響起始位置字符的定位,在終止位置的b隻影響終止位置字符的定位.例如 sort -b -k 2.2b,3.3b 的含義是,取以第二個域的第二個非空字符作爲開始,以第三個域的第3個非空字符作爲結束的字符串作爲鍵.
注:
空白符
--by default a blank is a space or a tab
--but the LC_CTYPE locale can change this
locale 不曾研究過,此處不談.

9  .-f (--ignore-case)
1)  調整鍵值的小寫字母爲等價的大寫字母(fold lowercase characters into the equivalent uppercase characters when comparing).即忽略大小寫.
2)  有一段話我不明白
When used with `--unique' those lower case equivalent lines are thrown away.  (There is currently no way to throw away the upper case equivalent instead. (Any `--reverse' given would only affect the final result, after the throwing away.))

10 . sort 的 -n 選項
1)  按算數值排序(sort numerically) , 關鍵字值 ,包含可選的空字符,可選的減號(-),0或多個數字字符,這些數字可能被千分位分隔符(thousands separator) 分隔開, 數字後有可選的小數點(decimal-point character) 以及0或多位數字. 關鍵字值爲空的話,看作0 . 
2)  加號(+)和指數符號(exponential notation) 是不能被辨認的

11 . -d (--dictionary-order)
1) 以字典序排序,排序中只關心字母(letters)數字(digits)和空白(blanks)
2)  字母和數字默認是那些 ASCII 字母和數字 , 這由locale 變量 LC_CTYPE 決定

12 . -r (--reverse)
1)  將sort 的結果反序(即,在輸出中,鍵值大的行將比小的先輸出)

13 . sort 的 -i 選項
1)  忽略不可打印字符(non-printing character)
2)  -i 選項比  -d 條件弱, 與 -d 同時使用將失效

14 . sort 的 -g 選項
1)  按算數大小排序(sort numerically),使用標準C函數strtod將每行的前綴轉換位一個雙精度浮點數(use the standard C function strtod to convert a prefix of each line to a double-precision floating point number).
2)  允許浮點數被定義爲科學記數法(scientific notation)形式,如 1.0e-34 10e100 .
3)  the LC_NUMERIC locale 決定了小數點字符(decimal-point character).
4)  不報告上溢 下溢 以及轉換錯誤(convertion error)
5)  使用如下的排序順序(collating sequence)
--不以數字開頭的行(所有這樣的行被認爲相等)
--NaNs(Not a number" values , in IEEE floating point arithmetic) in a consistent but machine-dependent order.
--負無窮(minus infinity)
--遞增的有限位數字,+0和-0是等同的.(finite numbers in ascending numeric order (with -0 and +0 equal).
--正無窮(plus infinity)
6)  儘量不用-g ,因爲比 -n 慢,而且轉換位浮點數時容易丟失信息.
 
15 . -R (--random-sort)
1)  使用隨機散列函數將鍵值做哈希 , 根據哈希值(hash value) 大小進行排序
2)  類似於對輸入的行進行隨機排列,只不過擁有相同鍵值的行會排在一起
3)  可以指定多個排序鍵,那麼該哈希函數將應用於所有的排序鍵;如果想對不同的鍵使用不同的哈希函數,那麼可以多次調用sort函數
4)  使用的哈希函數由--random-source 選項決定
--random-source=FILE
FILE文件將提供一些數據,根據這些數據,使用-R選項時就可以決定使用哪個隨機哈希函數

16 . -o (-o OUTPUT-FILE --output=OUTPUT-FILE)
1)  將輸出寫到文件OUTPUT-FILE ,而不是標準輸出
2)  如果文件在指令中同時用於輸入與輸出,要確保在完成全部的輸入之後纔打開該文件用於輸出. 通常,sort 能做到這一點,因此像sort -o file file 或者cat file | sort -o file 是不會有問題的.但是,-m選項能夠使得sort 函數在接受了所有的讀入之前就打開OUTPUT-FILE , 這樣就會出問題.例如 cat file | sort -m -o file 是不安全的.
3)  可移植的腳本應該保證-o選項不會出現在任何輸入文件之後,例如應該避免以下形式的指令,sort myfile -o in_file . 新的系統裏,如果POSIXLY_CORRECT 被設置,就會有這個要求.


17 . -s (--stable)
1)  使sort成爲穩定的排序算法.(通過避免-k中提到過的最後重排過程(last-resort comparison).
2)  如果sort沒有指定任何排序鍵,那麼默認將按行排序,此時,-s就不起作用了(因爲last-resort本來就是把根據排序鍵無法分出大小的行直接做行排序).

18 . -S (-S SIZE 即 --buffer-size=SIZE)
1)  指出sort可以使用的主存(main-memory)緩衝區大小.
2)  SIZE 默認爲1024 字節(bytes)
3)  SIZE 的數字(設爲n)前如果加b ,表示n bytes;加K表示n*1024 bytes; 加M表示n*(1024^2)bytes;加M表示n*(1024^3)bytes;加G表示n*(1024^4)bytes;T P E Z Y 的情況以此類推.
4)  -S 選項的好處是,如果SIZE合理,那麼能夠提高內存利用效率,因爲畢竟默認提供的內存可能過多也可能過少.
5)  當然,如果SIZE設置得比實際需要的內存少,那麼這時候-S就相當於無效.

19 . -u (--unique)
1)  check模式下,將檢查輸入的數據是否是行有序的;判斷機制是,是否存在連續的相等的行(check that no pair of consecutive lines compares equal).
2)  sort模式下,將禁止最後重排(last-resort ,-k選項中有介紹),並對輸出中相等的行只保留其第一行.
3)  值得一提的是,-u選項在sort模式下實際上暗含了-s選項;另外,如果sort沒有指定排序鍵,那麼-u將無法阻止sort以整行作爲鍵值;還有sort -u 和sort | uniq 是等價的.

20 . -T (-T TEMPDIR 或者 --temporary-directory=TEMPDIR)
1)  指定目錄TEMPDIR作爲存儲sort產生的臨時文件的目錄(默認目錄是/tmp) 
2)  -T的優點是,可以將大量的輸入輸出操作轉移到一些空閒的磁盤上,從而提高I/O效率.

21 . -M (--month-sort 或 --sort=month)
1)  將鍵值作爲月份來比較.鍵值可以可選地含0或多個空字符(製表符和空格),後面跟着月份的縮寫(month name abbreviation).
2)  鍵值中的小寫字符會被預處理爲大寫字符然後進行比較,比較的預定以順序是,JAN < FEB < ... < DEC ,不符合規範的月份名字比有效的名字小.
3)  locale LC_TIME 決定了月份的拼寫

22 . --compress-program=PROG
//  關於壓縮臨時文件的,沒怎麼看懂
   Compress any temporary files with the program PROG.  With no arguments, PROG must compress standard input to standard output, and when given the `-d' option it must decompress standard input to standard output.  Terminate with an error if PROG exits with nonzero status.  White space and the backslash character should not appear in PROG; they are reserved for future use.

23 . --files0-from=FILE
// 沒去研究,改日
Disallow processing files named on the command line, and instead process those named in file FILE; each name being terminated by a zero byte (ASCII NUL).  This is useful when the list of file names is so long that it may exceed a command line length limitation.  In such cases, running `sort' via `xargs' is undesirable because it splits the list into pieces and makes `sort' print sorted output for each sublist rather than for the entire list.  One way to produce a list of ASCII NUL terminated file names is with GNU `find', using its `-print0' predicate.  If FILE is `-' then the ASCII NUL terminated file names are read from standard input. 

24 . --batch-size=NMERGE
// 這個需要了解sort 的具體方法,應該不難,暫不去了解了
Merge at most NMERGE inputs at once.

     When `sort' has to merge more than NMERGE inputs, it merges them in groups of NMERGE, saving the result in a temporary file, which is then used as an input in a subsequent merge. 
     A large value of NMERGE may improve merge performance and decrease temporary storage utilization at the expense of increased memory usage and I/0.  Conversely a small value of NMERGE may reduce memory requirements and I/0 at the expense of temporary storage consumption and merge performance.
     The value of NMERGE must be at least 2.  The default value is currently 16, but this is implementation-dependent and may change in the future.

備註:
1) 本文參考資料,請在命令行下輸入如下指令獲得:
            info coreutils 'sort invocation' 
2) 本文一些論述的例證,將在下一篇文章中給出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章