再探sort命令

起因

之前只知道sort命令可以对文本排序,用选项-t指定分隔符,用-k指定排序字段,用-n指定字段为数字。但是由于实战机会较少,真正操练起来的时候,发现捉襟见肘,可以参见下面几个情景:

  1. 以数字大小对第一个域排序(基础)
  2. 以字符顺序对第一个域排序(基础)
  3. 以字符顺序对第一个域排序,但是只考虑第3个字符到10个字符
  4. 以数字大小对第一个域排序,相同则以数字大小对第二个域排序
  5. 以数字大小对第一个域排序,相同则以字符大小对第二个域排序

sort的规则

  1. sort的-k选项,会被局部选项和全局选项影响,局部选项覆盖全局选项,局部选项是跟在-k后面的选项,其余的为全局选项。
  2. 在不指定结束域的情况想,以数字排序,仅按指定的域排序,以字符串排序,则是指定域到行尾。
  3. 在指定域上的值相等的情况下,以字符顺序排序整行。
  4. 以数字排序时,提取域的前缀数字,处理为十进制,遇到非数字结束,所以域123abc的整数值为123。最好不要使用跨域数字排序,有个巨坑,最后再讲。
  5. 以字符串排序时,前缀相同的串,长度大的比较大。

下面将从这几个例子来分解sort命令

sort细节

平时我们用的sort命令的-k选项,其实是简写的方式,其完整的命令如下:

sort -k [FStart[.CStart]] [Modifier][, [FEnd[.CEnd]] [Modifier]] input.txt
sort -k 3.1,3.2n input.txt

上面的例子中的3.1,3.3n,各部分对应的值如下,其中,FStart就是要排序的起始域,CStart是起始域的第几个字符,FEnd是要排序的结束域,CEnd是结束域的第几个字符,Modifier是该排序选项的附加选项。即:对第3个域的第1到第3个字符进行数字排序。所以通常情况下的-k3则是,对第三个域到行尾进行字符顺序排序。

FStart=3
CStart=1
FEnd=3
CEnd=3
Modifier=n

例子:

  • 对第一个字段字符排序
对第一个字段字符排序
  • 对第一个字段排序,但从第二个字符开始
对第一个字段排序,但从第二个字符开始
  • 对第二个字符数字排序
对第二个字符数字排序
  • 对第二个字段字符排序
对第二个字段字符排序

所以,以下的意思是这样的

-k 7    #对第7列到行尾进行字符串排序
-k 7,8  #对第7列到第8列进行字符串排序
-k 7n    #对第7列进行数字排序
-k 7,8n  #对第7列到第8列进行数字排序
# 以上如果完全相等,则把 整行按字符串排序

后记

在使用时请注意几个点

  1. FStart必须小于等于EStart
  2. 如果不指定EStart,则从FStart到行尾,对字符排序和数字排序都遵守这个规则。但是数字排序就有个坑在这里:如果指定的分隔符不是逗号(,)那么跨域数字排序就没有跨域效果,栗子如下:
# 数据文件input.txt内容如下
a:100:400
b:100:300
c:10:3000
d:20:400
d:20:4000

sort -k2,3n -t':' input.txt

非逗号分隔符数字排序

从上面结果可以看出,非逗号数字排序在跨域排序时,仅按起始域排序,在起始域相同的情况下,按整行字符顺序再次排序。而不是按后续域排序,从a:100:400b:100:300的排序位置可以看出。

如果上述文件内容不变,仅把分隔符改为逗号(,),再看结果。

image.png

未曾改变数据,只改变了分隔符,结果大变。在这里我只能推测sort排序的数字处理方式如下:

  1. 提取指定域的内容,包括分隔符。
  2. 从左到右处理数字,同时忽略所有的逗号(可能因为有3位分数字的书写方式,1,234,567,仅猜测,我现在仅发现用逗号做分隔符的时候有这个现象),遇到非数字结束。
  3. 按上述步骤所得数字排序,如果相等则对整行字符排序。

再来看个例子:

奇怪的栗子

上面这个例子可以说明,-k选项在不指定结束域时,是默认到行尾的。所以在数字排序的时候提取的是第二个域到行尾,包括分隔符(即:20,4,0,0,0),处理时忽略逗号,于是20,4,0,0,0的值实际上是204000。

仅指定某一个域数字排序

如果仅指定某一个域进行数字排序,请按上面这种写法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 刚接触这个命令时一点头绪都没有,只知道照用,这篇博文还可以,能够理解一下基本原理。转载地址 1 sort的工作原理...
    王诗翔阅读 602评论 2 4
  • 1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值...
    Saxon_323e阅读 1,434评论 0 2
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,166评论 0 9
  • 无论是工作中使用还是应付各种面试,linux sort 都是必须要掌握的 linux 基本命令之一。尤其是 lin...
    smoke_zl阅读 39,755评论 2 32
  • sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始! 1 sort的工作...
    你清澈又神秘阅读 791评论 0 2