sort命令2--詳細版

原址: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 KeyDefinition
  • FSkip.CSkip(廢棄版本)。

使用 -k 標誌定義排序關鍵字

-k KeyDefinition 標誌採用下列形式:

-k [ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]

排序關鍵字包括所有以 FStart 變量指定的字段和 CStart 變量指定的列開頭的及以 FEnd 變量指定的字段和 CEnd 變量指定的列結束的字符。如果不指定 Fend,就假定行的最後一個字符。如果不指定 CEnd,就假定 FEnd 字段的最後一個字符。KeyDefinition 變量中的任何字段號或列號都可以省略。缺省值爲:

FStart 行開頭
CStart 字段第一列
FEnd 行結束
CEnd 字段最後一列

如果字段間有任意空格,sort 就把它們看作分隔的字段。

Modifier 變量的值可以是字母 bdfinr 中的一個或多個。修飾符僅應用於它們連接的字段定義,與同一字母的標誌有同樣的效果。修飾符字母 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 排序關鍵字定義後,那麼該標誌只能用於此排序關鍵字。
-A 使用 ASCII 整理順序代替當前語言環境的整理順序在逐字節的基礎上排序。
-b 忽略前導空格和製表符,找出字段的第一或最後列。
-c 檢查輸入是否已按照標誌中指定的排序規則進行排序。如果輸入文件排序不正確,就返回一個非零值。
-d 使用字典順序排序。比較中僅考慮字母、數字和空格。
-f 比較前將所有小寫字母改成大寫字母。
-i 比較中忽略所有非打印字符。
-k KeyDefinition 指定排序關鍵字。KeyDefinition 選項的格式爲:

[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]

排序關鍵字包括所有以 FStart 變量指定的字段和 CStart 變量指定的列開頭的字符及以 FEnd 變量指定的字段和 CEnd 變量指定的列結束的字符。Modifier 變量的值可以是 bdfinr。 修飾符與同一字母的標誌等價。

-m 只合並多個輸入文件;假設輸入文件已經排序。
-n 按算術值對數字字段排序。數字字段可包含前導空格、可選減號、十進制數字、千分位分隔符和可選基數符。對包含任何非數字字符的字段進行數字排序會出現無法預知的結果。
-o OutFile 將輸出指向 OutFile 參數指定的文件,而不是標準輸出。OutFile 參數值可以與 File 參數值相同。
-r 顛倒指定排序的順序。
-t Character 指定 Character 爲單一的字段分隔符。
-u 禁止按照排序關鍵字和選項的所有等同排序(每一組行中一行除外)。
-T Directory 將創建的所有臨時文件放入 Directory 參數指定的目錄中。
-y[Kilobytes] Kilobytes 參數指定的主存儲的千字節數啓動 sort 命令,並根據需要增加存儲量。(如果 Kilobytes 參數指定的值小於最小存儲站點或大於最大存儲站點,就以這個最小存儲站點或最大存儲站點取代)。如果省略 -y 標誌,sort 命令以缺省的存儲大小啓動。-y0 標誌用最小存儲啓動,而 -y 標誌(不帶 Kilobytes 值)用最大存儲啓動。sort 命令使用的存儲量顯著地影響性能。以大存儲量對小文件排序將很浪費。
-z RecordSize 如果正在排序的任一行大於缺省的緩衝區大小,要防止出現異常終止。指定 -c -m 標誌時,省略排序階段,使用系統的缺省緩衝大小。如果已排序行超出這一大小,排序異常終止。-z 選項指定排序階段最長行的記錄,因而可在合併階段分配足夠的緩衝區。RecordSize 必須指明等於或大於要合併的最長行的字節值。

退出狀態

該命令返回以下出口值:

0 所有輸入文件成功輸出,或指定了 -c 且正確排序了輸入文件。
1 -c 選項下,文件沒有按指定排序,或如果指定 -c-u 選項,找到了兩個具有相同關鍵字的輸入行。
>1 發生錯誤。

示例

  1. 要在 LC_ALLLC_COLLATELANG 環境變量設置爲 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 之外的字符集,結果可能不同。

  2. 要以字典順序排序,請輸入:
    sort  -d fruits
    此命令序列排序和顯示 fruits 文件的內容,並且只比較字母、數字和空格。如果 fruits 文件與示例 1 相同,那麼 sort 命令顯示:
    ORANGE
    Persimmon
    apple
    apple
    %%banana
    banana
    orange

    -d 標誌忽略 %(百分號)字符,因爲它不是個字母、數字或空格。(即 %%bananabanana 取代)。

  3. 要將包含大寫字母和具有類似小寫行的特殊字符行分組,請輸入:
    sort -d -f fruits
    -d 標誌忽略特殊字符,-f 標誌忽略大小寫差異。將 LC_ALLLC_COLLATELANG 環境變量設置爲 C 的情況下,fruits 文件的輸出結果變爲:
    apple
    apple
    %%banana
    banana
    ORANGE
    orange
    Persimmon
  4. 要除去重複行排序,請輸入:
    sort  -d  -f  -u fruits
    -u 標誌告訴 sort 命令除去重複的行,使文件中的每一行唯一。此命令序列顯示:
    apple
    %%banana
    orange
    Persimmon

    不僅除去重複的 apple,而且也除去了 bananaORANGE。除去這些是因爲 -d 標誌忽略 %% 這個特殊字符,-f 標誌忽略大小寫差異。

  5. 要如例 4 那樣排序,除去重複的實例(除非是大寫字母或標點不同),請輸入:
    sort  -u +0  -d -f +0 fruits
    輸入 +0 -d -f 完成的排序與示例 3 中 -d -f 的排序類型相同,+0 進行另一項比較以區分不一樣的行。這防止 -u 標誌將它們除去。

    示例 1 所示的 fruits 文件中,添加的 +0%%bananabananaORANGEorange 區分開來。然而,apple 的兩個實例是相同的,所以其中之一被刪除。

    apple
    %%banana
    banana
    ORANGE
    orange
    Persimmon
  6. 要指定分隔字段的字符,請輸入:
    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_ALLLC_COLLATELANG 環境變量設置爲 C 的情況下,sort 命令將顯示:

    carrots:104
    yams:104
    lettuce:15
    potatoes:15
    green beans:32
    radishes:5
    turnips:8

    注意數字沒有按照數字排序。當用字典式分類從左至右比較每一個字符時出現這種情況。換句話說,35 之前,所以 325 之前。

  7. 要排序數字,請輸入:
    sort  -t: +1  -n vegetables
    此命令序列按照第二個字段對 vegetables 文件進行數字排序。如果 vegetables 文件與示例 6 中的相同,那麼 sort 命令將顯示:
    radishes:5
    turnips:8
    lettuce:15
    potatoes:15
    green beans:32
    carrots:104
    yams:104
  8. 要對多個字段排序,請輸入:
    sort  -t: +1 -2  -n +0 -1  -r vegetables
    sort  -t:  -k2,2 n -k1,1 r vegetables
    此命令序列對第二字段(+1 -2 -n)進行數字排序。在這個順序中,它以逆字母順序(+0 -1 -r)對第一字段排序。將 LC_ALLLC_COLLATELANG 環境變量設置爲 C 的情況下,輸出將類似於:
    radishes:5
    turnips:8
    potatoes:15
    lettuce:15
    green beans:32
    yams:104
    carrots:104

    此命令按數字順序對行排序。當兩行數字相同時,它們以逆字母順序出現。

  9. 要使用排序的文本替換原始文件,請輸入:
    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 命令處理期間的臨時空間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章