Linux复杂的sort -k 按列排序命令,有坑!!

Posted 兔子爱读书

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux复杂的sort -k 按列排序命令,有坑!!相关的知识,希望对你有一定的参考价值。

  • 原理

【案例1】要求按第1列的第二、三个字符,按数字、逆序排序

sort -k 1.2, 1.3nr

这个语法格式可以被其中的逗号(“,”)分为两大部分,Start部分和End部分

先给你灌输一个思想,那就是“如果不设定End部分,那么就认为End被设定为行尾”。这个概念很重要。

前后两部分的点号(“. ”)用来分割指定列、指定字符

-k选项的具体语法格式,如下:

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

Start部分也由三部分组成,其中的Modifier部分就是我们之前说过的类似n和r的选项部分。我们重点说说Start部分的FStart和C.Start。

C.Start也是可以省略的,省略的话就表示从本域的开头部分开始。之前例子中的-k 2和-k 3就是省略了C.Start的例子喽。

FStart.CStart,其中FStart就是表示使用的域,而CStart则表示在FStart域中从第几个字符开始算“排序首字符”。

同理,在End部分中,你可以设定FEnd.CEnd,如果你省略.CEnd,则表示结尾到“域尾”,即本域的最后一个字符。或者,如果你将CEnd设定为0(零),也是表示结尾到“域尾”

跨域排序是不会成功的,只会按第一个域排序:$ sort -n -k 2.2,3.1 facebook.txt。

 

  • 第一个坑:sort默认分隔符是空格,如果不指定分隔符,可能会让你纠结半天

    【案例3】下列文件第一列是随机编号,第二列是日期,我们希望按第二列日期排序

    tmp.csv:

    327,2021/04/13 23:59:59
    12,2021/04/06 23:59:59
    1129,2021/04/03 23:59:59
    1,2021/04/06 23:59:59
    4,2021/04/06 23:59:59
    3413,2021/04/01 23:59:59
    26,2021/04/15 23:59:58
    2,2021/04/07 23:59:58

    不指定分隔符情况下,会发现排序结果乱七八糟的(因为默认空格为分隔符):

    > cat tmp.csv | sort -k 2r | cut -d "," -f 2
    2021/04/06 23:59:59
    2021/04/01 23:59:59
    2021/04/13 23:59:59
    2021/04/06 23:59:59
    2021/04/03 23:59:59
    2021/04/06 23:59:59
    2021/04/15 23:59:58
    2021/04/07 23:59:58
    

    正确的输入:

    > cat tmp.csv | sort -t ',' -k 2r | cut -d "," -f 2
    2021/04/15 23:59:58
    2021/04/13 23:59:59
    2021/04/07 23:59:58
    2021/04/06 23:59:59
    2021/04/06 23:59:59
    2021/04/06 23:59:59
    2021/04/03 23:59:59
    2021/04/01 23:59:59

第二个坑:sort排序一定要分出大小,当指定列内容相同时,会自动以其他列作为排序标准

假设我们按第二列排序,遇到第二列内容相同时,会默认从第一列开始排序;第一列也分不出来会按第三列,以此类推,直到分出大小(默认从小到大,有-r的情况下从大到小)

此处可能导致很多bug!!

【案例2】 test.csv:

8, 2021/02
10, 2021/05
10, 2021/03
10, 2021/04

现在想要按第一列从大到小排序,其他列保持原来的顺序(乱序)。————实际上做不到!!

第一种情况(错误):

> cat test.csv | sort -t ',' -k 1nr

10, 2021/05
10, 2021/04
10, 2021/03
8, 2021/02

可以看到,第一列按从大到小排序了,第二列居然也从大到小排序了。这是因为在指定列内容相同的情况下,默认其他列也要排序!!

第二种情况(错误):

> cat test.csv | sort -t ',' -k 1,1nr

10, 2021/05
10, 2021/04
10, 2021/03
8, 2021/02

可以看到,在序号相同的情况下,第二列依然要进行排序。

结论:一旦使用sort,就必须排出大小。指定列排不出来,就自动拿兄弟列来排,直到有个顺序。

 

更多参考:https://www.cnblogs.com/yangyongzhi/archive/2012/11/05/2755421.html

以上是关于Linux复杂的sort -k 按列排序命令,有坑!!的主要内容,如果未能解决你的问题,请参考以下文章

linux shell sort指令(sort命令)排序

如何按列对多维数组进行排序?

Linux排序命令sort(转)

Linux sort命令使用解析

linux命令之----sort命令用于将文本文件内容加以排序

linux 排序命令sort