sort

對文本文件中所有行進行排序。

概要

1sort [OPTION]... [FILE]...
2sort [OPTION]... --files0-from=F

主要用途

  • 將所有輸入文件的內容排序後並輸出。
  • 當沒有文件或文件爲-時,讀取標準輸入。

選項

排序選項:

 1-b, --ignore-leading-blanks    忽略開頭的空白。
 2-d, --dictionary-order         僅考慮空白、字母、數字。
 3-f, --ignore-case              將小寫字母作爲大寫字母考慮。
 4-g, --general-numeric-sort     根據數字排序。
 5-i, --ignore-nonprinting       排除不可打印字符。
 6-M, --month-sort               按照非月份、一月、十二月的順序排序。
 7-h, --human-numeric-sort       根據存儲容量排序(注意使用大寫字母,例如:2K 1G) 8-n, --numeric-sort             根據數字排序。
 9-R, --random-sort              隨機排序,但分組相同的行。
10--random-source=FILE           從FILE中獲取隨機長度的字節。
11-r, --reverse                  將結果倒序排列。
12--sort=WORD                    根據WORD排序,其中: general-numeric 等價於 -g,human-numeric 等價於 -h,month 等價於 -M,numeric 等價於 -n,random 等價於 -R,version 等價於 -V。
13-V, --version-sort             文本中(版本)數字的自然排序。

其他選項:

 1--batch-size=NMERGE                    一次合併最多NMERGE個輸入;超過部分使用臨時文件。
 2-c, --check, --check=diagnose-first    檢查輸入是否已排序,該操作不會執行排序。
 3-C, --check=quiet, --check=silent      類似於 -c 選項,但不輸出第一個未排序的行。
 4--compress-program=PROG                使用PROG壓縮臨時文件;使用PROG -d解壓縮。
 5--debug                                註釋用於排序的行,發送可疑用法的警報到stderr。
 6--files0-from=F                        從文件F中讀取以NUL結尾的所有文件名稱;如果F是 - ,那麼從標準輸入中讀取名字。
 7-k, --key=KEYDEF                       通過一個key排序;KEYDEF給出位置和類型。
 8-m, --merge                            合併已排序文件,之後不再排序。
 9-o, --output=FILE                      將結果寫入FILE而不是標準輸出。
10-s, --stable                           通過禁用最後的比較來穩定排序。
11-S, --buffer-size=SIZE                 使用SIZE作爲內存緩存大小。
12-t, --field-separator=SEP              使用SEP作爲列的分隔符。
13-T, --temporary-directory=DIR          使用DIR作爲臨時目錄,而不是 $TMPDIR 或 /tmp;多次使用該選項指定多個臨時目錄。
14--parallel=N                           將併發運行的排序數更改爲N。
15-u, --unique                           同時使用-c,嚴格檢查排序;不同時使用-c,輸出排序後去重的結果。
16-z, --zero-terminated                  設置行終止符爲NUL(空),而不是換行符。
17--help                                 顯示幫助信息並退出。
18--version                              顯示版本信息並退出。
19
20
21KEYDEF的格式爲:F[.C][OPTS][,F[.C][OPTS]] ,表示開始到結束的位置。
22F表示列的編號
23C表示
24OPTS爲[bdfgiMhnRrV]中的一到多個字符,用於覆蓋當前排序選項。
25使用--debug選項可診斷出錯誤的用法。
26
27
28SIZE 可以有以下的乘法後綴:
29% 內存的1%;
30b 1;
31K 1024(默認);
32剩餘的 M, G, T, P, E, Z, Y 可以類推出來。

參數

FILE(可選):要處理的文件,可以爲任意數量。

返回值

返回0表示成功,返回非0值表示失敗。

例子

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

 1root@[mail text]# cat sort.txt
 2aaa:10:1.1
 3ccc:30:3.3
 4ddd:40:4.4
 5bbb:20:2.2
 6eee:50:5.5
 7eee:50:5.5
 8
 9[root@mail text]# sort sort.txt
10aaa:10:1.1
11bbb:20:2.2
12ccc:30:3.3
13ddd:40:4.4
14eee:50:5.5
15eee:50:5.5

忽略相同行使用-u選項或者uniq

 1[root@mail text]# cat sort.txt
 2aaa:10:1.1
 3ccc:30:3.3
 4ddd:40:4.4
 5bbb:20:2.2
 6eee:50:5.5
 7eee:50:5.5
 8
 9[root@mail text]# sort -u sort.txt
10aaa:10:1.1
11bbb:20:2.2
12ccc:30:3.3
13ddd:40:4.4
14eee:50:5.5
15
16[root@mail text]# uniq sort.txt
17aaa:10:1.1
18ccc:30:3.3
19ddd:40:4.4
20bbb:20:2.2
21eee:50:5.5

sort-n、-r、-k、-t選項的使用:

 1[root@mail text]# cat sort.txt
 2AAA:BB:CC
 3aaa:30:1.6
 4ccc:50:3.3
 5ddd:20:4.2
 6bbb:10:2.5
 7eee:40:5.4
 8eee:60:5.1
 9
10# 將BB列按照數字從小到大順序排列:
11[root@mail text]# sort -nk 2 -t: sort.txt
12AAA:BB:CC
13bbb:10:2.5
14ddd:20:4.2
15aaa:30:1.6
16eee:40:5.4
17ccc:50:3.3
18eee:60:5.1
19
20# 將CC列數字從大到小順序排列:
21# -n是按照數字大小排序,-r是以相反順序,-k是指定需要排序的欄位,-t指定欄位分隔符爲冒號
22[root@mail text]# sort -nrk 3 -t: sort.txt
23eee:40:5.4
24eee:60:5.1
25ddd:20:4.2
26ccc:50:3.3
27bbb:10:2.5
28aaa:30:1.6
29AAA:BB:CC

關於-k選項的解讀和例子:

-k選項深度解讀:

1FStart.CStart Modifier,FEnd.CEnd Modifier
2-------Start--------,-------End--------
3 FStart.CStart 選項  ,  FEnd.CEnd 選項

這個語法格式可以被其中的逗號,分爲兩大部分,Start 部分和 End 部分。 Start部分由三部分組成,其中的Modifier部分就是我們之前說過的選項部分; 我們重點說說Start部分的FStartC.StartC.Start是可以省略的,省略的話就表示從本域的開頭部分開始。FStart.CStart,其中FStart就是表示使用的域,而CStart則表示在FStart域中從第幾個字符開始算排序首字符。 同理,在End部分中,你可以設定FEnd.CEnd,如果你省略.CEnd或將它設定爲0,則表示結尾到本域的最後一個字符。

例子:從公司英文名稱的第二個字母開始排序:

1$ sort -t ' ' -k 1.2 facebook.txt
2baidu 100 5000
3sohu 100 4500
4google 110 5000
5guge 50 3000

解讀:使用了-k 1.2,表示對第一個域的第二個字符開始到本域的最後一個字符爲止的字符串進行排序。你會發現baidu因爲第二個字母是a而名列榜首。sohu和google第二個字符都是o,但sohu的h在google的o前面,所以兩者分別排在第二和第三。guge只能屈居第四了。

例子:只針對公司英文名稱的第二個字母進行排序,如果相同的按照員工工資進行降序排序:

1$ sort -t ' ' -k 1.2,1.2 -nrk 3,3 facebook.txt
2baidu 100 5000
3google 110 5000
4sohu 100 4500
5guge 50 3000

解讀:由於只對第二個字母進行排序,所以我們使用了-k 1.2,1.2的表示方式,表示我們只對第二個字母進行排序(如果你問我使用-k 1.2怎麼不行?當然不行,因爲你省略了End部分,這就意味着你將對從第二個字母起到本域最後一個字符爲止的字符串進行排序)。 對員工工資進行排序,我們也使用了-k 3,3,這是最準確的表述,表示我們只對本域進行排序,因爲如果你省略了後面的3,就變成了我們對第3個域開始到最後一個域位置的內容進行排序了。

注意

  1. 關於-g和-n選項的區別:stackoverflow

  2. 關於這個複雜命令的學習,建議您閱讀info文檔及參考博客、問答網站等。

  3. 該命令是GNU coreutils包中的命令,相關的幫助信息請查看man -s 1 shufinfo coreutils 'shuf invocation'

來源:https://github.com/jaywcjlove/linux-command

最後修改於: Wednesday, January 31, 2024

相關文章:

翻譯: