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啊,不知道是不是我不會用的緣故。