Linux sort命令的幾個細節問題

2021-06-09 02:06:48 字數 2023 閱讀 7001

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命令將逐行對檔案中的內容進行排序,如果兩行的首字元相同,該命...