【经验总结】Join关联结果不正确问题

来源:互联网 发布:office软件哪里下载 编辑:程序博客网 时间:2024/06/07 03:46

Join关联结果不正确问题

By Katana

 

    Join命令是一个非常高效的命令,大家都用的非常多,但是有时候join的结果会有些问题,很多同事问过Join命令为什么有时候不能正确关联出数据,经过研究发现如下:

    大家都知道join之前是需要sort的,先看一个join实例:

    文件1:1.txt

        1.txt

        1002547 14

        1002549 15

        10025492 15

        10025472 14

    Sort之后的结果:

        sort 1.txt 

        1002547 14

        10025472 14

        1002549 15

        10025492 15

    文件2:2.txt

        1002547 14

        10025471 01

        10025476 01

        10025473 01

        1002549 135

        10025498 135

        10025492 115

    Sort之后的结果:

        sort 2.txt 

        10025471 01

        1002547 14

        10025473 01

        10025476 01

        1002549 135

        10025492 115

        10025498 135

    Join结果:

 

        1002549 15 135

        10025492 15 115

    而实际上应该join出3个:

        1002547

        1002549

        10025492

 

    大家如果对自己的结果一一去做仔细核查的话,其实会发现join少了不少数据。

    很多人也因为join经常莫名其妙的问题而放弃使用join改用其他更费事的办法。

 

    至于为什么sort会把10025471放到1002547前面?这完全是因为字符集的原因,因为不同的字符集有不同的字符大小排序和比较方式(同一个字符集字符比较方式也有多种):

        env|grep LANG

        LANG=zh_CN

    如果在执行前把字符集设置为C

        export LANG=C(如无效则需要设置更高的字符环境变量export LC_ALL=C)

        sort 1.txt 

        1002547 14

        10025472 14

        1002549 15

        10025492 15

        sort 2.txt

        1002547 14

        10025471 01

        10025473 01

        10025476 01

        1002549 135

        10025492 115

        10025498 135

    join出来的结果:

        1002547 14 14

        1002549 15 135

        10025492 15 115

 

 

    Sort是按照当前字符集顺序来排序,而join则需要按照标准顺序排序来连接。

 

    所以大家以后join来处理文件的时候,一定要指定字符集再使用sort

        export LANG=C

 

本文原创自无线技术运营空间: http://wireless.qzone.qq.com 及 http://blog.csdn.net/wireless_tech (专注无线技术运营——无线技术(操作系统/数据库/WEB前端/负载均衡/系统容灾/系统安全/短信接入/WAP接入/3G等)、无线业务运营、无线开放平台、统计分析(用户行为分析/数据挖掘)、CP合作,联系我们:1780551083@qq.com)