Join是将文件连接起来的一个命令
Join - join lines of two files on a common field
语法结构
join [-i][-a<1或2>][-e<字符串>][-o<格式>][-t<字符>][-v<1或2>][-1<栏位>][-2<栏位>][--help][--version][文件1][文件2]
- join的参数列表
- -a<1或2> 除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行。
- -e string 用string代替不存在的域
- -i 忽视大小写
- -o 按照指定的格式来显示结果。
- -t 字符串分割
- -j FIELD :等同于 -1 FIELD -2 FIELD,-j指定一个域作为匹配字段
- -v<1或2> 跟-a相同,但是只显示文件中没有相同栏位的行。
- -1 连接[文件1]指定的栏位
- -2 连接[文件2]指定的栏位
代码实现
实例
- join的使用方式
☁ 20151008 cat b
a s
b e
c b
d wq
☁ 20151008 cat low_up
a 61
b 25
c 15
d 32
☁ 20151008 join b low_up
a s 61
b e 25
c b 15
d wq 32
☁ 20151008 join low_up b
a 61 s
b 25 e
c 15 b
d 32 wq
join后面跟是文件是有顺序关系,并且只有相同的line才能join在一起
2 -a和-v的区别
- a是显示所有数据并且显示没有相同的line。
- v只显示文件中没有相同栏位的行。
##我们在文件加不相同的列,并且file1和file2的必须是一一对应的,如果不对应需要先排序
☁ 20151008 cat low_up
a 61
b 25
c 15
d 32
e 4
☁ 20151008 cat b
a s
b e
c b
d wq
☁ 20151008 join -a1 low_up b
a 61 s
b 25 e
c 15 b
d 32 wq
e 4
☁ 20151008 join -a2 low_up b
a 61 s
b 25 e
c 15 b
d 32 wq
☁ 20151008 join -v1 low_up b
e 4
☁ 20151008 join -v2 low_up b
这边稍微修改文件的位置,那么结果将完全不同
☁ 20151008 join -a1 low_up b
e 4
a 61
b 25
c 15
d 32
☁ 20151008 join -a2 low_up b
a s
b e
c b
d wq
☁ 20151008 join -v1 low_up b
e 4
a 61
b 25
c 15
d 32
☁ 20151008 join -v2 low_up b
a s
b e
c b
d wq
所以如果想要对文件进行join处理的话,需要提前对他进行排序,不然可能会跟预期的结果不一样
3. -o,-j和-t连用
- -o 按照指定的格式来显示结果。
- -t 字符串分割
- -j FIELD :等同于 -1 FIELD -2 FIELD,-j指定一个域作为匹配字段
☁ 20151008 cat low_up
a,61
b,25
c,15
d,32
☁ 20151008 cat b
a,s
b,e
c,b
d,wq
☁ 20151008 join -a1 -j1 -t, -o 1.1,1.2 low_up b
a,61
b,25
c,15
d,32
☁ 20151008 join -a1 -j1 -t, -o 1.1 low_up b
a
b
c
d
☁ 20151008 join -a1 -j1 -t, -o 1.2 low_up b
61
25
15
32
☁ 20151008 join -a2 -j1 -t, -o 1.1 low_up b
a
b
c
d
☁ 20151008 join -a2 -j2 -t, -o 1.1 low_up b
☁ 20151008 join -a2 -j1 -t, -o 1.1 low_up b
a
b
c
d
结论
总体来说你需要用什么命令那么需要看具体的业务需求,有需要去重的操作,有需要合并的操作都可以,个人也挺喜欢paste这个命令和sed,cut等命令结合处理起来处理文件的感觉也是棒棒哒.
顺带吐槽一下,MD感觉用起来有bug啊,不知道是不是我不会用的缘故。