linux/shell sort命令

sort是在Linux裏經常使用的一個命令,用來排序的html

# man sortlinux

 

1 sort的工做原理app

 

sort將文件的每一行做爲一個單位,相互比較,比較原則是從首字符向後,依次按ASCII碼值進行比較,最後將他們按升序輸出。spa

[rocrocket@rocrocket programming]$ cat seq.txt
banana
apple
pear
orange
[rocrocket@rocrocket programming]$ sort seq.txt
apple
banana
orange
pearunix

2 sort的-u選項code

它的做用很簡單,就是在輸出行中去除重複行htm

[rocrocket@rocrocket programming]$ cat seq.txt
banana
apple
pear
orange
pear
[rocrocket@rocrocket programming]$ sort seq.txt
apple
banana
orange
pear
pear
[rocrocket@rocrocket programming]$ sort -u seq.txt
apple
banana
orange
pear排序

pear因爲重複被-u選項無情的刪除了。ci

3 sort的-r選項字符串

sort默認的排序方式是升序,若是想改爲降序,就加個-r就搞定了。

[rocrocket@rocrocket programming]$ cat number.txt
1
3
5
2
4
[rocrocket@rocrocket programming]$ sort number.txt
1
2
3
4
5
[rocrocket@rocrocket programming]$ sort -r number.txt
5
4
3
2
1

4 sort的-o選項

因爲sort默認是把結果輸出到標準輸出,因此須要用重定向才能將結果寫入文件,形如sort filename > newfile。

可是,若是你想把排序結果輸出到原文件中,用重定向可就不行了。

[rocrocket@rocrocket programming]$ sort -r number.txt > number.txt
[rocrocket@rocrocket programming]$ cat number.txt
[rocrocket@rocrocket programming]$
看,居然將number清空了。

就在這個時候,-o選項出現了,它成功的解決了這個問題,讓你放心的將結果寫入原文件。這或許也是-o比重定向的惟一優點所在。

[rocrocket@rocrocket programming]$ cat number.txt
1
3
5
2
4
[rocrocket@rocrocket programming]$ sort -r number.txt -o number.txt
[rocrocket@rocrocket programming]$ cat number.txt
5
4
3
2
1

5 sort的-n選項

你有沒有遇到過10比2小的狀況。我反正遇到過。出現這種狀況是因爲排序程序將這些數字按字符來排序了,排序程序會先比較1和2,顯然1小,因此就 將10放在2前面嘍。這也是sort的一向做風。

咱們若是想改變這種現狀,就要使用-n選項,來告訴sort,「要以數值來排序」!

[rocrocket@rocrocket programming]$ cat number.txt
1
10
19
11
2
5
[rocrocket@rocrocket programming]$ sort number.txt
1
10
11
19
2
5
[rocrocket@rocrocket programming]$ sort -n number.txt
1
2
5
10
11
19

6 sort的-t選項和-k選項

若是有一個文件的內容是這樣:

[rocrocket@rocrocket programming]$ cat facebook.txt
banana:30:5.5
apple:10:2.5
pear:90:2.3
orange:20:3.4

這個文件有三列,列與列之間用冒號隔開了,第一列表示水果類型,第二列表示水果數量,第三列表示水果價格。

那麼我想以水果數量來排序,也就是以第二列來排序,如何利用sort實現?

幸虧,sort提供了-t選項,後面能夠設定間隔符。(是否是想起了cut和paste的-d選項,共鳴~~)

指定了間隔符以後,就能夠用-k來指定列數了。

[rocrocket@rocrocket programming]$ sort -n -k 2 -t : facebook.txt
apple:10:2.5
orange:20:3.4
banana:30:5.5
pear:90:2.3

咱們使用冒號做爲間隔符,並針對第二列來進行數值升序排序,結果很使人滿意。

7 其餘的sort經常使用選項

-f  會將小寫字母都轉換爲大寫字母來進行比較,亦即忽略大小寫

-c  會檢查文件是否已排好序,若是亂序,則輸出第一個亂序的行的相關信息,最後返回1

-C  會檢查文件是否已排好序,若是亂序,不輸出內容,僅返回1

-M  會以月份來排序,好比JAN小於FEB等等

-b  會忽略每一行前面的全部空白部分,從第一個可見字符開始比較。

 

sort同時對多列排序

sort -k1,1 -k2,2n #先對第一列以字符串排序,而且,再對第二列以數值排序;


當對不一樣的列進行不一樣的排序方式的時候,須要用k來指定起始列和終止列

-k1,1 表示對第一列進行字符串比較  1,1 表示起始列爲第一列,終止列也爲第一列
-k2,2n 表示僅對第二列進行數值比較

#############################################3

LANG=C sort

# 特別注意,要手工檢查排序的結果,好比如下這樣的數據若是用sort來作,排序結果不對:


1_159849533_159876791_minus
1_159857504_159876791_minus
1_159863063_159867704_minus
1_159863063_159876791_minus
1_159876394_159876791_minus
1_1600087_1620039_minus
1_1600087_1626312_minus
1_1600087_1663793_minus
1_160330_175755_minus
11_603753_604571_minus
11_61041769_61042463_plus
11_61041769_61080803_plus
11_61041769_61109204_plus
1_1611009_1620039_minus
1_16149007_16178803_plus
1_161514723_161524503_plus
1_161514723_161534950_plus
1_161611162_161612268_plus

As you can see, the Linux 'sort' ignores blanks, underscores, and
case while doing its thing, although these items are in the final output.
Also, each lower case letter lead character follows immediately after its
upper case brother, unlike the usual collating order where all uppercases,
together, precede the lower cases, as in the UNIX list above.
Also, the at-siogn, @, in the Linux sort comes between the exclamation and the
pound, but in UNIX, it is between the numerics and uppercase alphas.

We have tried to find what collating sequence file, LC_COLLATE, but cannot
make sense out of these data files and their associated directories in
/usr/share/locale/...

#############################################

REF

http://roclinux.cn/?p=1350

 

bugs of Sort:

https://lists.gnu.org/archive/html/bug-textutils/2000-10/msg00020.html

https://stackoverflow.com/questions/5868465/unusual-behaviour-of-linuxs-sort-command

https://unix.stackexchange.com/questions/29681/issues-of-using-sort-and-comm

https://unix.stackexchange.com/questions/224164/sort-command-inconsistent-behavior

相關文章
相關標籤/搜索