Linux 中使用 sort 指令分组排序详解
sort 中进行分组排序主要用到的选项为 -k
,此文,我们着重于该选项的使用方式,用到的其它选项不做解释,有兴趣的同学可以查看帮助文档
1. 数据准备
现有数据如下,文件名 sort_source.txt
Nov 1 : 4548
Nov 2 : 1383
Oct 2 : 3738
Oct 3 : 418
Nov 4 : 1383
Nov 14 : 1383
Nov 11 : 1381
Nov 12 : 1381
Oct 4 : 4105
Oct 5 : 4089
2. 数据处理
2.1 按某一列进行排序
# 按第一列进行月份排序
sort -k 1M sort_source.txt
# 输出如下:
Oct 2 : 3738
Oct 3 : 418
Oct 4 : 4105
Oct 5 : 4089
Nov 11 : 1381
Nov 12 : 1381
Nov 14 : 1383
Nov 1 : 4548
Nov 2 : 1383
Nov 4 : 1383# 按第 2 列进行数字排序
sort -k 2g sort_source.txt
# 输出如下:
Nov 1 : 4548
Nov 2 : 1383
Oct 2 : 3738
Oct 3 : 418
Nov 4 : 1383
Oct 4 : 4105
Oct 5 : 4089
Nov 11 : 1381
Nov 12 : 1381
Nov 14 : 1383
2.2 分组排序
# 先按第一列进行排序(分组),再按第二列进行排序
sort -k 1M -k2g sort_source.txt
# 输出如下:
Oct 2 : 3738
Oct 3 : 418
Oct 4 : 4105
Oct 5 : 4089
Nov 1 : 4548
Nov 2 : 1383
Nov 4 : 1383
Nov 11 : 1381
Nov 12 : 1381
Nov 14 : 1383
2.3 按某列的某几个字符进行排序
2.3.1 不指定分割符的情况下
不指定分割符的情况下,会从空格处进行计数,起始偏移量为 1
# 按第四列的第二、三个可显字符进行数字排序
sort -k 4.3,4.4g sort_source.txt
# 输出如下:注意,第3个字符是从空白字符开始算,起始为 1
Oct 5 : 4089 # 第四列第3个字符为0
Oct 4 : 4105
Oct 3 : 418
Nov 11 : 1381
Nov 12 : 1381
Nov 14 : 1383
Nov 2 : 1383
Nov 4 : 1383
Nov 1 : 4548
Oct 2 : 3738
2.3.2 指定分割符的情况下
指定分割符时,以第一个非指定字符为起始,偏移量为 1
# 按第四列的第二、三个字符进行数字排序
sort -t ' ' -k 4.2,4.3g sort_source.txt
# 输出如下:注意,第2个字符是从非空白字符开始算,起始为 1
Oct 5 : 4089 # 第四列第2个字符为0
Oct 4 : 4105
Oct 3 : 418
Nov 11 : 1381
Nov 12 : 1381
Nov 14 : 1383
Nov 2 : 1383
Nov 4 : 1383
Nov 1 : 4548
Oct 2 : 3738
2.3.2 指定分割符的情况下按某列内的某一个字符进行排序
注意,要按某个确切的字符进行排序,则起始偏移量和结束偏移量要相同,且必须要指定结束偏移量
# 按第四列的第3个字符进行数字排序
sort -t ' ' -k 4.3,4.3g sort_source.txt
# 输出如下:注意,第3个字符是从非空白字符开始算,起始为 1
Oct 4 : 4105
Oct 2 : 3738
Nov 1 : 4548
Nov 11 : 1381
Nov 12 : 1381
Nov 14 : 1383
Nov 2 : 1383
Nov 4 : 1383
Oct 3 : 418
Oct 5 : 4089