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. [Git]04 如何使用标签

     Git也可以对某一时间点上的版本打上标签.人们在发布某个软件版本(比如 v1.0 等等)的时候,经常这么做. 本节我们一起来学习如何如何新建标签,列出所有可用的标签,以及各种不同类型标签之间的差 ...

  2. 2017Unity开发者大会备受关注的原因有哪些?

    Unite大会是由Unity举办的全球开发者大会,至今已有10年的历史.从最开始Unity开发者大会仅500人,到现在Unity大会已经增长到5000人,10倍的参与人数,Unity开发者大会仅仅用了 ...

  3. 云计算之路-阿里云上:负载均衡错误修改Cookie造成用户无法登录

    最近陆续有用户反馈在我们网站上登录时遇到登录死循环问题.输入用户名与密码提交后,显示登录成功,但跳转到目标网址后(由于依然处于未登录状态)又跳转回登录页面,再次登录,再次这样...就这样一直循环,怎么 ...

  4. elasticsearch系列(二) esrally压测

    环境准备 linux centOS(工作环境) python3.4及以上 pip3 JDK8 git1.9及以上 gradle2.13级以上 准备过程中的坑 这些环境准备没什么太大问题,都是wget下 ...

  5. 关于MAC设置免费的动态壁纸

    首先大部分的动态壁纸都是收费的或者是已经固定的,其实这一款也是固定的 但是这个固定的是可以进行修改的 第一先在App Store下载 LiveDesktop Pro  这一款是免费的 然后下载后进行打 ...

  6. redis多数据库操作

    redis下,数据库是由一个整数索引标识,而不是由一个数据库名称.默认情况下,一个客户端连接到数据库0. redis配置文件中下面的参数来控制数据库总数: databases 16   [root@M ...

  7. tpcc-mysql安装

    1.因为我的虚拟机是centos 7 min版本,所以先得安装gcc gcc++: http://mirror.centos.org/centos/7/os/x86_64/Packages/   rp ...

  8. 算法问题:最长滑道问题(非递归,C++)

    题目描述请参考博客http://blog.csdn.net/sinat_30186009/article/details/52356053,在此表示感谢. 基本思路参考了以上文章,但是上面文章中的算法 ...

  9. centos永久修改主机名

    永久修改主机名 以上的修改只是临时修改,重启后就恢复原样了. 步骤1: 修改/etc/sysconfig/network中的hostname vi /etc/sysconfig/network HOS ...

  10. VFP 实验参考答案

    1.    使用for循环计算1到1000之间能既能被7整除也能被11整除的所有的数的和.(结果为6006)源程序代码 sum=0 i=1 for i=1 to 1000 if((i%7=0) and ...