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/tmpsort 命令处理期间的临时空间。
/usr/tmp如果不能在 /var/tmp 中创建文件,是 sort 命令处理期间的临时空间。
/tmp如果不能在 /var/tmp/usr/tmp 中创建文件,是 sort 命令处理期间的临时空间。

<think>我们正在讨论Linuxsort命令的参数,特别是-t、-k5和-nr。根据引用[3],-t选项用于指定字段分隔符。例如,-t';'表示使用分号作为分隔符。引用[1]中提到,-k5表示从第5列开始排序(注意:这里列是从1开始计数的)。同时,-n表示按数值排序,-r表示逆序(降序)。所以,用户的问题:sort命令的参数-t-k5-nr的详解。我们需要解释:1.-t:指定分隔符,后面需要跟分隔符字符(如-t','表示用逗号分隔)。2.-k5:指定排序的关键字段,这里表示以第5个字段(列)作为排序的依据。3.-n:按数值大小排序,而不是按字符串(默认)。4.-r:降序排序(默认是升序)。组合起来:-t指定分隔符(注意,用户示例中没有指定-t,所以可能默认使用空格或制表符分隔),然后用第5列作为排序的关键字,按数值降序排序。注意:在引用[1]的例子中:ls-al|sort-k5-rn这里没有使用-t,因为ls-al的输出默认是空格分隔(但注意,多个空格会被视为一个分隔符吗?实际上,sort默认会将空白字符(空格和制表符)作为分隔符,并且多个连续的空白字符被视为一个分隔符。但是,在ls-al的输出中,第5列是文件大小(数值),所以使用-n按数值排序,-r表示从大到小。因此,我们可以这样回答:参数详解:-t选项:用于指定字段分隔符。例如,`-t','`表示使用逗号作为分隔符。如果没有指定,则默认使用空白字符(空格或制表符)作为分隔符,并且连续多个空白字符被视为一个分隔符。-k5选项:指定根据第5个字段(列)进行排序。注意,字段编号从1开始。-n选项:告诉sort命令按照数值大小排序,而不是按照字符串的字典序。这对于数字排序非常重要,否则会出现10比2小的情况(因为字符串比较时'10'的第一个字符'1'比'2'小)。-r选项:表示逆序排序,即从大到小(默认是升序,即从小到大)。另外,这些选项可以组合使用,例如`-nr`表示按数值逆序排序。我们可以举一个例子,比如用户想对一个以分号分隔的文件,按照第3列数值降序排序:sort-t';'-k3nrfilename或者,如果我们没有指定分隔符,那么默认按空白分隔,例如:sort-k2nfile#按照第2列数值升序排序注意:在使用-k时,可以指定字段的范围,例如-k2,3表示从第2个字段开始到第3个字段结束(作为排序的关键字)。但这里用户只用了-k5,表示只用第5个字段。最后,我们生成相关问题。</think> ### Linux sort 命令参数详解:`-t`, `-k5`, `-nr` #### 📌 参数作用与组合效果 `sort -t -k5 -nr` 是一个组合参数: 1. **整体功能**:**按第5列数值降序排序**(字段分隔符需通过 `-t` 显式指定) 2. **典型场景**:处理表格数据(如日志、CSV等),按特定数值列高效排序 --- #### ⚙️ 参数拆解说明 1. **`-t`**(字段分隔符) - **作用**:指定列之间的分隔符,**必须**后接分隔符(如 `-t':'` 或 `-t';'`) - **错误示例**:`sort -t -k5 ...` ❌(缺少实际分隔符) - **正确用法**: ```bash sort -t':' -k5n file.txt # 使用冒号分隔列 sort -t';' -k2,2n data.csv # 使用分号分隔[^3] ``` - **默认行为**:未指定时用空白符(空格/Tab)分隔,连续空白视为单分隔符 2. **`-k5`**(排序字段) - **作用**:以**第5列为排序依据**(字段编号从1开始) - **示例**:`ls -al | sort -k5 -n` → 将`ls`输出的**第5列(文件大小)** 作为排序键[^1] - **扩展格式**:`-k 起始列[,结束列]` ```bash sort -k3,5n file # 按第3到第5列联合排序 ``` 3. **`-nr`**(排序规则) | 参数 | 全称 | 作用 | |---|---|---| | `-n` | `--numeric-sort` | **数值排序**(避免字典序,如 10>2)[^1] | | `-r` | `--reverse` | **降序排列**(默认升序)[^2] | --- #### 🧪 应用案例 ```bash # 对 /etc/passwd 按第3列(UID)降序排序 sort -t':' -k3nr /etc/passwd # 解析:-t':'=用冒号分列,-k3=第3列,-n=数值排序,-r=降序 ``` 输出示例: ``` mysql:x:131:137:MySQL Server:/nonexistent:/bin/false nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin _apt:x:100:65534::/nonexistent:/bin/false ``` --- #### ⚠️ 注意要点 1. **`-t` 必须指定分隔符**,否则报错:`sort: 字段分隔符缺失` 2. **列边界判定**: - `-k5` 指第5列(非第5字符) - 列号溢出时按最后一列处理 3. **性能优化**:对大文件建议加 `-S 内存大小` 控制内存用量 --- #### 💡 相关问题 1. 当文件用空格分隔且含空列时,`-k` 如何准确定位字段? 2. 如何实现多级排序(如先按第2列升序,再按第5列降序)? 3. `-n` 和 `-g`(通用数值排序)参数有何区别? 4. 处理带千分位符的数值(如 1,024)时需注意什么? [^1]: ls -al \| sort -k5 -rn // -k指定列,-r降序,-n数值排序 [^2]: sort命令基础语法:字段排序、反向输出选项 [^3]: 使用 -t 指定字段分隔符案例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值