Linux的join命令

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]指定的栏位

代码实现

实例

  1. join的使用方式
20151008  cat b
a s
b e
c b
d wq
☁  20151008  cat low_up
a 61
b 25
c 15
d 3220151008  join b low_up
a s 61
b e 25
c b 15
d wq 3220151008  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 420151008  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 420151008  join -a2 low_up b
a 61 s
b 25 e
c 15 b
d 32 wq
☁  20151008  join -v1 low_up b
e 420151008  join -v2 low_up b

这边稍微修改文件的位置,那么结果将完全不同

20151008  join -a1 low_up b
e 4
a 61
b 25
c 15
d 3220151008  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 3220151008  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,3220151008  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,3220151008  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
3220151008  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啊,不知道是不是我不会用的缘故。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章