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 按列排序命令,有坑!!的主要内容,如果未能解决你的问题,请参考以下文章