shell 如何实现两个表的join操作

今天研究的一个问题是:在Shell 脚本中如何实现两个表的 join 操作,这里说的两个表示的其实是

两个文件,但是文件是列表的形式,有固定的分割符号,即就相当于hive中一个非分区表的文件。

表的操作当然是在数据库中操作是最好的: 比如有: table1 table2,我们需要根据 column1 主键关联

select * from table1 a table2 b where a.column1 = b.column1

搞定。如果需要复杂一点的,可以用 join 操作实现。

但是如果你手上刚好有两个文件呢?一种办法是导入数据库,这样太慢了,下面用shell命令实现。

数据样例

假设 table1.txt 文件的样例数据如下:

daacdaaedyWcMIV= http://mp.weixin.qq.com/s?__biz=daacdaaedyWcMIV=&mid=200664912&idx=1&sn=c3fbe92847655211faf109c6856f4c0a

daacddeMdcedauY= http://mp.weixin.qq.com/s?__biz=daacddeMdcedauY=&mid=200435227&idx=1&sn=a8802c19dacf0b2db6462eaec09c0b19

daacddeVdeaudaY= http://mp.weixin.qq.com/s?__biz=daacddeVdeaudaY=&mid=200668153&idx=1&sn=869b00b38caa70de6c32848f396b8aa6

daacdduydVWyeMM= http://mp.weixin.qq.com/s?__biz=daacdduydVWyeMM=&mid=200659749&idx=1&sn=6fe9107dd69dd3b5de32bf6e5597a408

daacdeMddMMyVWw= http://mp.weixin.qq.com/s?__biz=daacdeMddMMyVWw=&mid=200912280&idx=7&sn=a70041d29f6b4ad06554ea97291d06bc

daacdMcadMMyduV= http://mp.weixin.qq.com/s?__biz=daacdMcadMMyduV=&mid=200654058&idx=3&sn=a6e57a52b1bd9c38f392825da34b499d

daacdudVdIecyMY= http://mp.weixin.qq.com/s?__biz=daacdudVdIecyMY=&mid=200382730&idx=4&sn=aeed567f2ad4ee595846623f7e2c8fbf

daacduyudeVeWdv= http://mp.weixin.qq.com/s?__biz=daacduyudeVeWdv=&mid=200468183&idx=1&sn=df3d20eef948571d3120b74416b9b010

daacdycIdWdyaIV= http://mp.weixin.qq.com/s?__biz=daacdycIdWdyaIV=&mid=200839908&idx=8&sn=40eb71efc2e70a779af0fc782ac78c47

daacdyIydayccyV= http://mp.weixin.qq.com/s?__biz=daacdyIydayccyV=&mid=200303209&idx=1&sn=63fbd789967812b16ff71b3667d36095```

table2.txt 文件的样例数据如下:

MjM5MDQ3MDIyMg==

MjM5MDU2OTI4OQ==

MjM5MDc5MTk2NQ==

MjM5MDg5MDE2Nw==

MjM5MDk3NDQ4Mw==

MjM5MTA4MTEyNQ==

MjM5MTQwMzcwMA==

MjM5MjEwMjkyMA==

MjM5MjM2ODU5Nw==

MjM5MjMxOTYxMw==

下面的任务就是要找出table1.txt中所有主键存在于table2.txt中的记录,文件的主键都是第一列

shell命令

awk -F'\t' ' {if (ARGIND==1) ccc[$1]} {if (ARGIND>1 && ($1 in ccc)) print $0} ' test2.txt test1.txt > test.txt

命令解释:

awk -F 表示字段分割符号

接下来是命令,命令必须用单引号包围,双引号不行。

ARGIND == 1表示读取到第一个文件,就把第一列存入数组ccc

当读到其他文件,这里就是第二个文件,就判断它的第一列是否在数组中,在就输出。

结束语

为什么选择用shell命令实现这个功能呢?我发现我数据量在一个文件700m,另一个文件30m的情况下,

只需要一分钟出结果,不必数据库慢很多,比其他工具,如R语言快太多,R语言还可能跑不了,

数据分析工作者适当的掌握几个有用的shell工具,如grep、awk、goin等,事半功倍。

shell中join链接多个域_shell 如何实现两个表的join操作相关推荐

  1. mysql比对表中数据是否相同_如何用sql比较两张表数据是否一致?

    在批量程序的测试中,经常会涉及到对数据库表的测试,今天我们来介绍一下用sql比较两张表结构相同的表数据是否完全一致的方法. 1.inner join 浅尝 提到比对两张表的数据是否完全相同,很容易想到 ...

  2. shell中join链接多个域_Linux Shell中使用awk完成两个文件的关联Join

    Shell中的awk命令是非常强大的,有很多书籍专门介绍awk的.本文介绍的只是其中很小的一个点,使用awk命令完成两个文件的关联join. 先看看awk中的两个自身变量,NR和FNR. awk可以指 ...

  3. shell中文件路径用变量定义_shell学习笔记01(概述amp;变量)

    Shell概述 为什么要学习Shell呢? 因为有用. Shell脚本入门 1.脚本格式 脚本以#!/bin/bash开头(指定解析器) 2.第一个Shell脚本:helloworld (1)需求:创 ...

  4. spark做两张大表的join操作,mapPartition和重分区算子的使用策略

    Spark中做两个大hive表的join操作,先读取过来处理成两个数据量很大的RDD,如果两个RDD直接进行join操作,势必会造成shuffle等导致运行非常缓慢,那么怎么优化呢?方法如下: 首先, ...

  5. linux系统冒号模式map怎么用,shell中冒号 : 用途说明

    我们知道,在Linux系统中,冒号(:)常用来做路径的分隔符(PATH),数据字段的分隔符(/etc/passwd)等.其实,冒号(:)在Bash中也是一个内建命令,它啥也不做,是个空命令.只起到占一 ...

  6. SCMS中的链接值算法(CCSA版本)

    背景 为了以最小的空间开销实现PC证书的撤销,SCMS采用了链接值算法来生成PC证书中的CN字段: 用一个种子ls(0)ls(0)ls(0)扩展生成某设备指定周期iii的链接值种子ls(i)ls(i) ...

  7. hive分桶表join_Hive:JOIN及JOIN优化 2015.10.25

    1. Join的基本原理 大家都知道,Hive会将所有的SQL查询转化为Map/Reduce作业运行于Hadoop集群之上.在这里简要介绍Hive将Join转化为Map/Reduce的基本原理(其它查 ...

  8. mysql关联表id_mysql join联表 + id自增

    join的写法 如果用left join 左边的表一定是驱动表吗?两个表的join包含多个条件的等值匹配,都要写道on还是只把一个写到on,其余写道where部分? createtablea(f1in ...

  9. left join 和 left outer join (可解决多个表left join的问题)

    http://blog.csdn.net/laolaowhn/archive/2007/09/07/1776219.aspx 通俗的讲:     A    left     join    B   的 ...

最新文章

  1. Ruby系统中的AJAX开发技术简析
  2. redis常用优化及持久化到硬盘
  3. es6 使用修饰器实现自动发布事件
  4. 华硕ROG5电竞手机跑分数据曝光:骁龙888+16G超大运存
  5. mysql在window的使用记录
  6. Linux命令解释之find
  7. (二)OpenCV Mat常用属性和方法
  8. 数据结构乐智教学百度云_数据结构 百度网盘分享
  9. 我的私房IT学习网站
  10. php 扫描条形码,将条形码扫描仪集成到PHP应用程序中?
  11. elasticsearch(es)的安装-macOs
  12. 光谱分析软件_利用Tracker软件分析车前草提取液的吸收光谱特征
  13. 计算机管理磁盘管理,windows7双磁盘管理图文教程
  14. ws2812 程序设计与应用(1)DMA 控制 PWM 占空比原理及实现(STM32)
  15. ubuntu命令 图片 壁纸_[教程]Ubuntu下完整配置自动壁纸切换
  16. “枪枪爆头”!用Python写个了使命召唤外挂
  17. 无锡室内设计——流行的几种室内装饰风格
  18. 图观目前各类芯片的交货周期
  19. Access根据出生日期计算年龄_不好意思,Power Query里根据出生日期计算年龄有点儿繁琐!...
  20. JavaPoet开源项目的使用

热门文章

  1. 每日一皮:产品经理的黑化,你听过几个?
  2. 面试:说说Java中的 volatile 关键词?
  3. GitHub被“中介”攻击了?啥是中间人攻击?
  4. javascript清除map所占内存_【原创.54期】 JavaScript的V8引擎初探
  5. java冒泡排序程序流图_java实现选择排序和冒泡排序及执行流程图解
  6. C2059 语法错误:“)”
  7. HNSW算法原理(二)之删除结点
  8. 10013: An attempt was made to access a socket in a way forbidden by its access permissions
  9. torch bceloss nan
  10. pytorch 索引