原址:http://study.chyangwa.com/IT/AIX/aixcmds5/sort.htm
用途
排序文件、對已排序的文件進行合併,並檢查文件以確定它們是否已排序。
語法
sort [ -A ] [ -b ] [ -c ] [ -d ][ -f ] [ -i ] [ -m] [ -n ] [ -r ] [ -u ] [ -o OutFile ] [ -t Character ] [ -T Directory ] [ -y [ Kilobytes ] ] [ -z RecordSize ] [ [ + [ FSkip ] [ .CSkip ] [ b ] [ d ] [ f ] [ i ] [ n ] [ r ] ] [ - [ FSkip ] [ .CSkip ] [ b ] [ d ] [ f ] [ i ] [ n ] [ r ] ] ] ... [ -k KeyDefinition ] ... [ File ... ]
描述
sort 命令對 File 參數指定的文件中的行排序,並將結果寫到標準輸出。如果 File 參數指定多個文件,那麼 sort 命令將這些文件連接起來,並當作一個文件進行排序。-(減號)代替文件名指定標準輸入。如果您不指定任何文件名,那麼該命令對標準輸入排序。可以使用 -o 標誌指定輸出文件。
如果不指定任何標誌,sort 命令基於當前語言環境的整理順序對輸入文件的所有行排序。
排序關鍵字
排序關鍵字是輸入行的一部分,由字段號和列號指定。字段是輸入行的組成部分,由字段分隔符分隔。缺省字段分隔符是由一個或多個連續空格字符組成的序列。使用 -t 標誌可指定不同的字段分隔符。在 C 語言和英語語言環境下,製表符和空格字符都是空格符。
使用排序關鍵字時,sort 命令首先根據第一個排序關鍵字的內容對所有行排序。然後,根據第二個排序關鍵字的內容,對所有第一個排序關鍵字相同的行排序,如此進行下去。按照排序關鍵字在命令行中出現的順序給它們編號。如果兩行對所有排序關鍵字的排序都相同,則對全部行依據當前語言環境的整理順序進行比較。
對字段中的列進行編號時,缺省字段分隔符中的空格符將作爲後繼字段計數。前導空格不計作第一字段的一部分,-t 標誌指定的字段分隔符將不作爲字段的一部分計數。可使用 -b 標誌忽略前導空格符。
可使用下列兩種方法定義排序關鍵字:
使用 -k 標誌定義排序關鍵字
-k KeyDefinition 標誌採用下列形式:
-k [ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]
排序關鍵字包括所有以 FStart 變量指定的字段和 CStart 變量指定的列開頭的及以 FEnd 變量指定的字段和 CEnd 變量指定的列結束的字符。如果不指定 Fend,就假定行的最後一個字符。如果不指定 CEnd,就假定 FEnd 字段的最後一個字符。KeyDefinition 變量中的任何字段號或列號都可以省略。缺省值爲:
FStart | 行開頭 |
CStart | 字段第一列 |
FEnd | 行結束 |
CEnd | 字段最後一列 |
如果字段間有任意空格,sort 就把它們看作分隔的字段。
Modifier 變量的值可以是字母 b、d、f、i、n 或 r 中的一個或多個。修飾符僅應用於它們連接的字段定義,與同一字母的標誌有同樣的效果。修飾符字母 b 僅應用於其連接的字段定義的末尾。例如:
-k 3.2b,3r
指定排序關鍵字,從第三字段的第二非空格列開始並擴展至第三字段結束,對這個關鍵字的排序以逆向整理順序完成。如果 FStart 變量和 CStart 變量在命令行末尾以外或在 FEnd 變量和 CEnd 變量之後,那麼該排序關鍵字被忽略。
排序關鍵字也可用下列方式指定:
[+[FSkip1][.CSkip1] [Modifier] ] [-[FSkip2] [.CSkip2] [Modifier]]
+FSkip1 變量指定跳過的字段數以到達排序關鍵字第一字段,+CSkip 變量指定在該字段中跳過的列數以到達排序關鍵字第一個字符。-FSkip 變量指定跳過的字段數以到達排序關鍵字後的第一個字符,-CSkip 變量指定在該字段中跳過的列數。可以省略任何要跳過的字段和列。缺省值爲:
FSkip1 | 行開頭 |
CSkip1 | 零 |
FSkip2 | 行結束 |
CSkip2 | 零 |
Modifier 變量指定的修改量與 -k 標誌關鍵字排序定義中的相同。
因爲 +FSkip1.CSkip1 變量指定到達排序關鍵字前要跳過多少字段和列,所以這些變量指定的字段號和列號通常比排序關鍵字本身的字段號和列號小 1。例如:
+2.1b -3r
指定排序關鍵字,從第三字段的第二非空格列開始並擴展至第三字段結束,對這個關鍵字的排序以逆向整理順序完成。語句 +2.1b 指定跳過兩個字段,然後跳過前導空格和另一列。如果 +FSkip1.CSkip1 變量在命令行末尾以外或在 -FSkip2.CSkip2 變量之後,則忽略該排序關鍵字。
注:一行的最大字段數爲 10。
標誌
注:在任何排序關鍵字定義前出現的 -b、-d、-f、-i、-n 或 -r 標誌應用於所有排序關鍵字。-b、-d、-f、-i、-n 或 -r 標誌都不能單獨出現在 -k KeyDefinition 之後;如果它們作爲修飾符連接 KeyDefinition 變量,那麼就只應用於連接排序關鍵字。如果這些標誌之一跟隨在 +Fskip.Cskip 或 -Fskip.Cskip 排序關鍵字定義後,那麼該標誌只能用於此排序關鍵字。
退出狀態
該命令返回以下出口值:
0 | 所有輸入文件成功輸出,或指定了 -c 且正確排序了輸入文件。 |
1 | 在 -c 選項下,文件沒有按指定排序,或如果指定 -c 和 -u 選項,找到了兩個具有相同關鍵字的輸入行。 |
>1 | 發生錯誤。 |
示例
- 要在
LC_ALL、LC_COLLATE 或 LANG 環境變量設置爲
En_US 的情況下排序 fruits 文件,請輸入:
LANG=En_US sort fruits
此命令序列顯示以升序詞典順序排序的 fruits 文件的內容。每一列的字符,包括空格、數字和特殊字符都經一一比較。例如,如果 fruits 文件包含文本:
banana orange Persimmon apple %%banana apple ORANGE
sort 命令顯示:
%%banana ORANGE Persimmon apple apple banana orange
在 ASCII 整理序列中,%(百分號)在大寫字母前,大寫字母在小寫字母前。如果您當前的語言環境指定 ASCII 之外的字符集,結果可能不同。
- 要以字典順序排序,請輸入:
sort -d fruits此命令序列排序和顯示 fruits 文件的內容,並且只比較字母、數字和空格。如果 fruits 文件與示例 1 相同,那麼 sort 命令顯示:
ORANGE Persimmon apple apple %%banana banana orange
-d 標誌忽略 %(百分號)字符,因爲它不是個字母、數字或空格。(即 %%banana 被 banana 取代)。
- 要將包含大寫字母和具有類似小寫行的特殊字符行分組,請輸入:
-d 標誌忽略特殊字符,-f 標誌忽略大小寫差異。將
LC_ALL、LC_COLLATE 或 LANG 環境變量設置爲
C 的情況下,fruits 文件的輸出結果變爲:
apple apple %%banana banana ORANGE orange Persimmon
- 要除去重複行排序,請輸入:
-u 標誌告訴 sort 命令除去重複的行,使文件中的每一行唯一。此命令序列顯示:
apple %%banana orange Persimmon
不僅除去重複的 apple,而且也除去了 banana 和 ORANGE。除去這些是因爲 -d 標誌忽略 %% 這個特殊字符,-f 標誌忽略大小寫差異。
- 要如例 4 那樣排序,除去重複的實例(除非是大寫字母或標點不同),請輸入:
輸入 +0 -d -f 完成的排序與示例 3 中 -d -f 的排序類型相同,+0 進行另一項比較以區分不一樣的行。這防止
-u 標誌將它們除去。
示例 1 所示的 fruits 文件中,添加的 +0 將 %%banana 與 banana 及 ORANGE 與 orange 區分開來。然而,apple 的兩個實例是相同的,所以其中之一被刪除。
apple %%banana banana ORANGE orange Persimmon
- 要指定分隔字段的字符,請輸入:
sort -t: +1 vegetables此命令序列排序 vegetables 文件,對每一行上第一個冒號後的文本進行比較。+1 告訴 sort 命令忽略第一字段,從第二字段的開始到該行的結束進行比較。-t: 標誌告訴 sort 命令冒號分隔字段。如果 vegetables 包含:
yams:104 turnips:8 potatoes:15 carrots:104 green beans:32 radishes:5 lettuce:15
那麼,將 LC_ALL、LC_COLLATE 或 LANG 環境變量設置爲 C 的情況下,sort 命令將顯示:
carrots:104 yams:104 lettuce:15 potatoes:15 green beans:32 radishes:5 turnips:8
注意數字沒有按照數字排序。當用字典式分類從左至右比較每一個字符時出現這種情況。換句話說,3 在 5 之前,所以 32 在 5 之前。
- 要排序數字,請輸入:
此命令序列按照第二個字段對 vegetables 文件進行數字排序。如果 vegetables 文件與示例 6 中的相同,那麼
sort 命令將顯示:
radishes:5 turnips:8 lettuce:15 potatoes:15 green beans:32 carrots:104 yams:104
- 要對多個字段排序,請輸入:
或
此命令序列對第二字段(+1 -2 -n)進行數字排序。在這個順序中,它以逆字母順序(+0 -1 -r)對第一字段排序。將
LC_ALL、LC_COLLATE 或 LANG 環境變量設置爲 C 的情況下,輸出將類似於:
radishes:5 turnips:8 potatoes:15 lettuce:15 green beans:32 yams:104 carrots:104
此命令按數字順序對行排序。當兩行數字相同時,它們以逆字母順序出現。
- 要使用排序的文本替換原始文件,請輸入:
sort -o vegetables vegetables此命令序列將排序輸出存入 vegetables 文件( -o vegetables)。
文件
/usr/bin/sort | 包含 sort 命令。 |
/var/tmp | sort 命令處理期間的臨時空間。 |
/usr/tmp | 如果不能在 /var/tmp 中創建文件,是 sort 命令處理期間的臨時空間。 |
/tmp | 如果不能在 /var/tmp 或 /usr/tmp 中創建文件,是 sort 命令處理期間的臨時空間。 |