数据库操作中,可以使用join把两个表连接起来,输出结果。join命令可以应用到两个文件上,达到文件join的目的。
例如文件A为保险记录,其中有订单id,保单号,保险价格
cat A 1 bx10 30 2 bx20 20 2 bx22 10 4 bx04 40
文件B为订单记录 其中有 订单id,订单号,姓名
cat B 1 or10 zhangsan 2 or20 lisi 3 or30 wangwu
现在,想要知道订单or20的保险号和保险金额。用join,so easy
join A B 1 bx10 30 or10 zhangsan 2 bx20 20 or20 lisi 2 bx22 10 or20 lisiwangwu因为没有买保险,结果中没有展示。那么如何展示除wangwu呢
join -v2 A B 3 or30 wangwu
join -v1 A B 4 bx04 40
现在介绍一下join命令
用法:join [选项]... 文件1 文件2
-a FILENUM FILENUM 为文件编号,1表示文件1,2表示文件2。a为all的简写啦,因此a1就是输出a的所有行啦。
-e EMPTY 空数据用EMPTY替代。
-i, --ignore-case 忽略大小写
-j FIELD equivalent to '-1 FIELD -2 FIELD' 这个没理解
-o FORMAT 输出格式例如"1.1,2.2,1.2,1.3"
-t CHAR 字段分割符,默认是空格。
-v 文件编号 类似于grep 中的v参数。加上v后,匹配上的数据就不输出了。
-1 FIELD
-2 FIELD 用文件1中的FIELD 和文件2中的FIELD比较。作为关联两个文件的key。这里的编号从1开始。
--check-order 检查输入行是否正确排序,即使所有输入行均是成对的
--nocheck-order 不检查输入是否正确排序
看几个高级的
格式化输出
join -11 -21 -o'1.1,2.2,1.2,2.3' A B 1 or10 bx10 zhangsan 2 or20 bx20 lisi 2 or20 bx22 lisi
join -11 -21 -a1 -a2 -e"__" -o'1.1,2.2,1.2,2.3' A B 1 or10 bx10 zhangsan 2 or20 bx20 lisi 2 or20 bx22 lisi __ or30 __ wangwu 4 __ bx04 __其实-v参数相当强大。如果还记得用uniq求数据的交和差,那么能用join实现吗?
默认join不就是交集吗
而-v后不就是差集了。。。。
我去,忘了件事。用于关联的key需要排序。。。。