Linux sort -g 的困惑
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-01020160722 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 的困惑的更多相关文章
- linux sort 命令详解(转 )
linux sort 命令详解 sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始! 1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比 ...
- linux sort,uniq,cut,wc命令详解
linux sort,uniq,cut,wc命令详解 sort sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出.如果 File 参数指定多个文件,那么 sort 命令将这些 ...
- linux sort命令学习
linux sort命令以行为单位对文本文件进行排序. 接下来我们会以/tmp/sort_test.txt这个文本文件为例对sort命令的用法进行说明. sh-# cat /tmp/sort_test ...
- (转)linux sort,uniq,cut,wc命令详解
linux sort,uniq,cut,wc命令详解 sort sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出.如果 File 参数指定多个文件,那么 sort 命令将这些 ...
- linux sort按照指定列排序
sort怎样按指定的列排序0000 27189 41925425065f 15 419254250663 7 419254250675 5 419254250691 76 419254250693 2 ...
- 【转帖】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 ...
- Linux sort -n 与 -g 排序对比
公司业务需要,天天用awk统计数值然后排序,出问题了,如下: count.sh 是一个统计脚本,把awk输出的值按占比.条数.类型 在重新输出 awk -F\| '{print $16}' *MQTT ...
- 【转】linux sort 命令详解
sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始! 1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按AS ...
- linux sort 命令详解
sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始! 1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按AS ...
随机推荐
- PHP 无限级分类(递归)
网上有很多,这是我自己做测试用的$arr = array( array('id'=>1,'name'=>'电脑','pid'=>0), array('id'=>2,'name' ...
- shell入门笔记1:执行方式、运行方式、变量、替换
说明: 本文是关于http://c.biancheng.net/cpp/shell/的相关笔记 shell的两种执行方式 交互式(interactive) 解释执行用户的命令,用户输入一条命令,She ...
- 初识hadoop-历史及其家族(日志一)
1,书籍推荐: 2,Google技术带来的东西: 下一篇:JDK的安装级其中遇到的问题
- FileZilla可以连接但是传输文件失败
在linux本地创建文件夹后,用FileZilla传输文件失败了. 如果用的是普通用户,创建的文件夹是属于root用户.所以不能传输,没有权限. 修改权限:sudo chown -R lishengn ...
- hdu1520 Anniversary party 简单树形DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 思路:树形DP的入门题 定义dp[root][1]表示以root为根节点的子树,且root本身参 ...
- javaweb之监听器详解
在servlet中定义了多种类型的监听器,他们用于监听事件源分别是servletContext,httpsession,servletrequest 这三个域对象. servlet中监听器主要有三类: ...
- JAVA CyclicBarrier类详解
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时CyclicBarrie ...
- Sql Server + ADO.NET
MsSql-http://www.cnblogs.com/zhangwei595806165/archive/2012/02/23/2364746.html 协议:Shared Memory :效率最 ...
- Java类加载和卸载的跟踪
博客搬家自https://my.oschina.net/itsyizu/blog/ 什么是类的加载和卸载 Java程序的运行离不开类的加载,为了更好地理解程序的执行,有时候需要知道系统加载了哪些类.一 ...
- 腾讯云万象优图每个账户提供50G的图片存储(支持黄图检测)
文章由GIT博客迁移过来 程序下载地址(源码也在):点我下载 设计说明 10月20号晚上,准备写这么一个程序. 腾讯云万象优图每个账户提供50G的图片存储(支持黄图检测) 可以在截图之后,直接点击上传 ...