linux sort命令的原理是逐行按字元進行比較排序,當然,也可以通過命令列引數設定按數字進行比較,或者指定行間的分隔符,對某乙個或一些字段按照自己指定的規則進行排序。這是乙個很常用而且很方便的命令,但是其中的一些細節需要注意,否則會得到錯誤的排序結果。
1. 比較方式
前面說過,sort
命令預設是按照字串排序,真的是這樣麼?看看
sort
的help
資訊,末尾有這樣的文字:
*** warning ***
the locale specified by the environment affects sort order.
set lc_all=c to get the traditional sort order that uses
native byte values.
看來,環境變數也能影響sort
的排序結果。實際試試看:
~$ cat text
11$1{1
~$ sort text
1{111$
~$ echo $lc_all
~$
論ascii
字元的大小,』{』應該比』1』大,但是上面的結果顯示,當lc_all
變數為空值時,
sort
命令輸出了錯誤的排序結果。不過,在更多的平台上實驗發現,
lc_all
為空的時候並不一定會輸出這個錯誤的結果,具體原因不詳。不過,如果按照
sort
的幫助資訊設定
lc_all
,則結果是正確的,』1』排在』{』前面。
如果了解lc***
系列的變數,其實只需要設定
lc_collate
即可,該變數控制的是字串的排序方式,在手頭上的幾種平台上實驗,結果都是正確的。
2. 按數字排序
加-n引數按數字排序。如果一行中還有非數字字元,則按照非數字字元前面的數字大小進行排序。
~$ cat text
11$1{1
~$ export lc_all=c
~$ sort text
11$1{1
~$ sort -n text
1{111$
3. 重定向
一般sort
命令將排序結果輸出到終端,如果想寫入檔案可以用重定向的方式,但是,如果想讓排序結果直接寫到排序前的檔案,用一般的重定向方式
sort file_name > file_name
達不到效果,需要用
sort
命令的-o
引數。
4. 分隔字段
預設的排序是以行為單位的排序,如果想按照某個字段進行排序,可以用-t
選項指定字段分隔符,
-k指定要排序的字段。
-k引數的格式為
-k start[,end]
,需要注意的是,如果省略了
end,則需要比較到行末,例如:
~$ cat text
1|101|2
1|10|2
~$ echo $lc_all
c~$ sort -t "|" -k 2 text
1|101|2
1|10|2
~$ sort -t "|" -k 2,2 text
1|10|2
1|101|2
雖然10
排在101
前面,但是不指定字段結束時,缺省會繼續比較,即比較』|』和』1』,所以有上面的結果。
通常,我們只希望按照乙個或者多個字段排序,而不希望從某個字段開始一直比較到行末,所以用這個引數時最好同時指定start
和end。
5. 多條件排序
在按字段排序時如果想採用多個排序條件,如先按第二列公升序,如果相同則按第三列降序,可以使用多個-k
引數,如
-k 2,2n –k 3,3nr
linux sort命令的使用
sort 以行為單位,從頭逐個比較每個字元的ascii值,按照公升序進行輸出。預設沒有選項的情況下,只排序。m2 crawl 10 cat poem see fan need winds you need to cry,dear how made winds holy high holy high ...
linux sort 命令詳解
sort命令的功能是對檔案中的各行進行排序。sort命令有許多非常實用的選項,這些選項最初是用來對資料庫格式的檔案內容進行各種排序操作的。實際 上,sort命令可以被認為是乙個非常強大的資料管理工具,用來管理內容類似資料庫記錄的檔案。sort命令將逐行對檔案中的內容進行排序,如果兩行的首字元相同,該...
linux sort 命令詳解
sort命令的功能是對檔案中的各行進行排序。sort命令有許多非常實用的選項,這些選項最初是用來對資料庫格式的檔案內容進行各種排序操作的。實際上,sort命令可以被認為是乙個非常強大的資料管理工具,用來管理內容類似資料庫記錄的檔案。sort命令將逐行對檔案中的內容進行排序,如果兩行的首字元相同,該命...