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. .net之抽象工厂模式

    //抽象工厂 //抽象食物 namespace abstractFactory{ public abstract class food { public abstract void Food(); } ...

  2. 最长递增子序列hdu1087

    #include<map> #include<set> #include<list> #include<cmath> #include<queue ...

  3. javascript函数作用域及this指向详解

    一.先说一个简单的概念--变量提升: 通过function+函数名的方式,声明的函数,可以在代码中的任何位置调用: 通过var定义变量的方式,声明的函数,则必须在声明之后进行调用,原因就是在变量定义之 ...

  4. css 3d 基础知识

    css3d 总结 3d transform (3D变形)(rotate skew scale translate) 基础知识 perspective (视距,景深) perspective-origi ...

  5. Linux command not found 问题解释

    执行可执行文件 执行文件就是具有可执行权限的文件,如果在文件所在目录上执行 ll 或 ls -l命令时,可能看到如下结果:-rwxr-xr-- 1 usr users 289 Jul 29 09:15 ...

  6. 通过分析 JDK 源代码研究 TreeMap 红黑树算法实

    TreeMap和TreeSet是Java Collection Framework的两个重要成员,其中TreeMap是Map接口的常用实现类,而TreeSet是Set接口的常用实现类.虽然HashMa ...

  7. nginx 日志分割(简单、全面)

    Nginx 日志分割 因业务需要做了简单的Nginx 日志分割, 第1章 详细配置如下. #建议在mkdir  /home/shell  -p 专门写shell 脚本位置 root@localhost ...

  8. 空间索引 - GeoHash算法及其实现优化

    h1,h2,h3,h4,h5,h6,p,blockquote { margin: 0; padding: 0 } body { font-family: "Helvetica Neue&qu ...

  9. HTML head头部标签总结

    HTML head 头部分的标签.元素有很多,涉及到浏览器对网页的渲染,SEO 等等,而各个浏览器内核以及各个国内浏览器厂商都有些自己的标签元素,这就造成了很多差异性.移动互联网时代,head 头部结 ...

  10. 【JAVAWEB学习笔记】03_JavaScript

    javascript简单介绍 ECMAScript 1.语法 2.变量:只能使用var定义,如果在函数的内容使用var定义,那么它是一个局部变量,如果没有使用var它是一个全局的.弱类型! 3.数据类 ...