sort命令是帮我们依据不同的数据类型进行排序,排序的效率很高,因此也是很常用的命令。

sort参考及说明:https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html

本文主要讨论在排序时使用g所产生的困惑。

在对一个文件进行排序,我们经常会根据文件中的几列依次来排序。

20160722 817657 EUR EUR.L LIBOR M 6 1.53399856212991e-006
20160722 817657 EUR EUR.L LIBOR M 9 1.73682111461871e-006
20160722 817657 USD USD.L BASISOIS M 24 -1.23799103559608e-010
20160722 817657 USD USD.L BASISOIS M 36 -1.61320184994397e-010

对以上的数据进行排序时,我们用到了这样的一个sort command:  sort -t $'\t' -k 2,2g -k 3,3g -k 4,4 -k 5,5 -k 6,6 -k 7,7 -f

至于为什么用g,在数据列中也能看到排序科学记数法(e)的时候使用n排序是不准确的,一般来说n,g排序非数字也没有问题,出于通用性考虑要排序的一般字符都使用的g。

根据sort key,按照一个tab分隔列,按照g排序2,3列,其他的默认排序,那么预期结果因该是:

20160722 817657 EUR EUR.L LIBOR M 6 1.53399856212991e-006
20160722 817657 EUR EUR.L LIBOR M 9 1.73682111461871e-006
20160722 817657 USD USD.L BASISOIS M 24 -1.23799103559608e-010
20160722 817657 USD USD.L BASISOIS M 36 -1.61320184994397e-010

然而结果却是:

20160722 817657 USD USD.L BASISOIS M 24 -1.23799103559608e-010
20160722 817657 USD USD.L BASISOIS M 36 -1.61320184994397e-010

20160722 817657 EUR EUR.L LIBOR M 6 1.53399856212991e-006
20160722 817657 EUR EUR.L LIBOR M 9 1.73682111461871e-006

这是为什么呢,在google上找了很久也没有找到类似的问题,在stackoverflow上有经验的人试了试我的这个sortkey去排序,有人排序是正常的。

我尝试用n和默认排序也是正常的,唯独用g出现的不是预想的结果。为了排除其他因素,去掉了所有不影响的因素。

我们对下面的这些数据来进行排序:

ABC
EUR
USD
0
0.000
0.000000000001
0.1
0.0000000000000000000000000000000000000000000000000000
EW

使用sortkey: sort -k 1,1g -f

ABC
USD
0
0.000
0.0000000000000000000000000000000000000000000000000000
EUR
EW
0.000000000001
0.1

这个显然不是我们预期的,我们再使用sortkey: sort -k 1,1 -f

0
0.000
0.0000000000000000000000000000000000000000000000000000
0.000000000001
0.1
ABC
EUR
EW
USD

这个最起码E不会出现在中间,再假如我们使用sortkey:sort -k 1,1n -f

0
0.000
0.0000000000000000000000000000000000000000000000000000
ABC
EUR
EW
USD
0.000000000001
0.1

我们怎么才能让g也能排出字母不会被当成数字呢,我们可以使用:LC_ALL=C sort -k 1,1g -f

ABC
EUR
EW
USD
0
0.000
0.0000000000000000000000000000000000000000000000000000
0.000000000001
0.1

首先,为什么现在g可以正常排序了而不是把e开头的当成0了,这是因为LC_ALL=C 覆盖掉了本地环境设置,排序都按照ascii码来排序,默认应该是LC_ALL=en_US.UTF,也可以单独设置各个LC。

但是接着问题就来了,用LC_ALL=C来排序的话,-f就会失效,因为按照ascii码 小写字母是排在大写字母后面的,这就产生了冲突。

因此可以先执行LC_ALL=C,然后再进行排序。

LC_ALL=en_US.UTF sort -k 1,1g -f 也可以正常的排序了。

这方面还需要多学习,再去找到一些其他方面的问题和主要的问题产生的源头。

有更好的资料请告诉我,关于sort.

Linux sort -g 的困惑的更多相关文章

  1. linux sort 命令详解(转 )

    linux sort 命令详解 sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始! 1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比 ...

  2. linux sort,uniq,cut,wc命令详解

    linux sort,uniq,cut,wc命令详解 sort sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出.如果 File 参数指定多个文件,那么 sort 命令将这些 ...

  3. linux sort命令学习

    linux sort命令以行为单位对文本文件进行排序. 接下来我们会以/tmp/sort_test.txt这个文本文件为例对sort命令的用法进行说明. sh-# cat /tmp/sort_test ...

  4. (转)linux sort,uniq,cut,wc命令详解

    linux sort,uniq,cut,wc命令详解 sort sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出.如果 File 参数指定多个文件,那么 sort 命令将这些 ...

  5. linux sort按照指定列排序

    sort怎样按指定的列排序0000 27189 41925425065f 15 419254250663 7 419254250675 5 419254250691 76 419254250693 2 ...

  6. 【转帖】linux sort,uniq,cut,wc,tr,xargs命令详解

    linux sort,uniq,cut,wc,tr,xargs命令详解 http://embeddedlinux.org.cn/emb-linux/entry-level/201607/21-5550 ...

  7. Linux sort -n 与 -g 排序对比

    公司业务需要,天天用awk统计数值然后排序,出问题了,如下: count.sh 是一个统计脚本,把awk输出的值按占比.条数.类型 在重新输出 awk -F\| '{print $16}' *MQTT ...

  8. 【转】linux sort 命令详解

    sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始! 1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按AS ...

  9. linux sort 命令详解

    sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始! 1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按AS ...

随机推荐

  1. CodeSmith生成实体的分页读取规则

    首先.我得向咱们博客园提个意见,能不能我写的东西就给预保存下呢?刚才我写半天,只因为这个不给力的IE浏览器死了,导致我白写了,如果这要是那个大神直接在这上面写的非常有技术含量的贴着会因此而丢失实在是有 ...

  2. 配置RMAN备份环境

    关于配置RMAN备份环境你可以给每个目标数据库设置一些固定的配置,这些配置控制着RMAN多个方面的行为.例如,你可配置备份的保存策略.默认的备份目录.默认的备份设备类型等.你可以用show命令来查看配 ...

  3. javascript 表达式和运算符 (二)

    表达式是一种JS短语,可使JS解释器用来产生一个值. 一.表达式 表达式分类 1.原始表达式 常量.直接量 (3.14,"test"); 关键字 (null,this,true): ...

  4. 在Core环境下用WebRequest连接上远程的web Api 实现数据的简单CRUD(续)

    这篇博客是上篇博客的续写,上篇博客用的是HttpClient取远程数据,用WebRequest提交,更新,删除数据.上篇本来想全文都用httpClient,可是当时无论如何也实现不了数据的提交,于是换 ...

  5. windows10 配置 华为vpn客户端

    2017-05-08 1. 安装客户端软件VPNClient_V100R001C02SPC703.exe 2. 新建vpn 安装完成后,打开客户端连接vpn,发现未启用虚拟网卡(这是因为还需要安装客户 ...

  6. 记录——excel导出lua工具(python实现)

    项目需要一个从excel导出lua配置表的工具,之前的工具是主程写的,效率极差,i7 CPU 一次全部导出要花掉1个多小时.匪夷所思的是,这么渣的效率,居然用了整整一年.当 然,中途有人反映效率差,主 ...

  7. TPshop分销功能的使用与表设计

    首先来段科普,摘自百度百科: 在西方经济学中,分销 的含义是建立销售渠道的意思,根据著名的营销大师菲利普·科特勒的定义,分销渠道(Distribution Channel)又或者叫营销渠道(Marke ...

  8. (转)static 变量

    一. static 变量 static变量大致分为三种用法1. 用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期.2. 用于全局变量,主要作用是限制此全局变量被其他的文 ...

  9. .Net程序员学用Oracle系列(28):PLSQL 之SQL分类和动态SQL

    1.SQL 语句分类 1.1.分类方法及类型 1.2.数据定义语言 1.3.数据操纵语言 1.4.其它语句 2.动态 SQL 理论 2.1.动态 SQL 的用途 2.2.动态 SQL 的语法 2.3. ...

  10. Java源码学习 -- java.lang.StringBuilder,java.lang.StringBuffer,java.lang.AbstractStringBuilder

    一直以来,都是看到网上说“ StringBuilder是线程不安全的,但运行效率高:StringBuffer 是线程安全的,但运行效率低”,然后默默记住:一个是线程安全.一个线程不安全,但对内在原因并 ...