[shell]join两个文件

数据库操作中,可以使用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 lisi
wangwu因为没有买保险,结果中没有展示。那么如何展示除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需要排序。。。。


你可能感兴趣的:([shell]join两个文件)