关于linux join命令

来源:互联网 发布:游戏服务端数据库架构 编辑:程序博客网 时间:2024/05/02 01:34

回复:http://blog.csdn.net/carolzhang8406/archive/2011/01/02/6112045.aspx

你好,你写的内容都很详细透彻,很适合初学者[e03]!提个关于join的问题!
如果对已经排序好的文件file1、file2使用join容易理解,但如果这两个文件内容顺序不一致,join也能给出部分输出,请问这些输出内容是根据什么流程得出的?

例如下面的例子:
# paste file1 file2
1 sd 5 1234
3 lsdkf 4  8405
5 ddf 4  sd8405
2 dlio 3 184
4 2
2 dlio 2 skf
 1 84
# join -e xxx file1 file2
5 ddf 1234
4 8405 xxx
4 sd8405 xxx

个人分析join工作原理:
  开始指针A、B分别定位到文件1/2的第一行
  --> 首先取file2中的第一行,并在file1中寻找首字段与之相匹配的行
 如果找到匹配行则合并此两行并输出,接着B定位到文件2的下一行,A定位到所找到的匹配行
     --> 继续测试匹配关系,如果匹配则合并输出此行,直到file2中遇到与之不匹配的行,或file2/file1到达文件末尾后退出
 如果在文件1中没有找到匹配行则直接退出
=============================================
      似乎上面的流程能解释join的工作表现,现在我将file2中的"3 184"这一行移动到第二行
# paste file1 file2
1 sd 5 1234
3 lsdkf 3 184
5 ddf 4  8405
2 dlio 4  sd8405
4 2
2 dlio 2 skf
 1 84
     推测结果: 在file2中"5 1234"匹配到file1中的"5 ddf"后,将轮到下一行"3 184",此行从"5 ddf"起(包括此行)往后寻找匹配行,结果果没有找到匹配行,join工作结束,并输出结果:
5 ddf 1234

    实际结果:
# join -e xxx file1 file2
5 ddf 1234
4 8405 xxx
4 sd8405 xxx
2 dlio
2 dlio skf

    问题[e07]:
    为什么上面测试没能按照推测的结果输出?
   如果将file2的第一行改成"5x 1234",即让file2从第一行开始就找不到匹配行,推测结果是直接结束,join无输出结果。实际上又与推测结果相符合,这又是为什么?
   另外,join默认是以文件中的每行第一个字段作为匹配字段,如何自定义其它字段为匹配字段?


linux的世界中,菜鸟共同修行。。。。