join用法:
j o i n用來将來自兩個分類文本檔案的行連在一起。如果學過S Q L語言,可能會很熟悉j o i n
指令。
下面講述j o i n工作方式。這裡有兩個檔案f i l e 1和f i l e 2,當然已經分類。每個檔案裡都有一
些元素與另一個檔案相關。由于這種關系, j o i n将兩個檔案連在一起,這有點像修改一個主文
件,使之包含兩個檔案裡的共同元素。
文本檔案中的域通常由空格或t a b鍵分隔,但如果願意,可以指定其他的域分隔符。一些
系統要求使用j o i n時檔案域要少于2 0,為公平起見,如果域大于2 0,應使用D B M S系統。
為有效使用j o i n,需分别将輸入檔案分類。
其一般格式為:
join [options] input-file1 input-file2
讓我們看看它的可用選項清單:
an n 為一數字,用于連接配接時從檔案n中顯示不比對行。例如, - a 1顯示第一個檔案的不匹
配行,- a 2為從第二個檔案中顯示不比對行。
o n.m n為檔案号,m為域号。1 . 3表示隻顯示檔案1第三域,每個n,m必須用逗号分隔,
如1 . 3,2 . 1。
j n m n為檔案号,m為域号。使用其他域做連接配接域。
t 域分隔符。用來設定非空格或t a b鍵的域分隔符。例如,指定冒号做域分隔符- t:。
現有兩個文本檔案,其中一個包含名字和街道位址,稱為n a m e . t x t,另一個是名字和城鎮,
為t o w n . t x t。
[[email protected] ~]# cat names.txt
M.Golls 12 Hidd Rd
P.Heller The Acre
P.Willey 132 The Grove
T.Norms 84 Connaught Rd
K.Fletch 12 Woodlea
[[email protected] ~]# cat town.txt
M.Golls Norwich NRD
P.Willey Galashiels GDD
T.Norms Brandon BSL
K.Fletch Mildenhall MAF
連接配接兩個檔案,使得名字支援詳細位址。例如M . G o l l s記錄指出位址為12 Hidd Rd。連接配接
域為域0—名字域。因為兩個檔案此域相同, j o i n将假定這是連接配接域:
[[email protected] ~]# join names.txt town.txt
M.Golls 12 Hidd Rd Norwich NRD
P.Willey 132 The Grove Galashiels GDD
T.Norms 84 Connaught Rd Brandon BSL
K.Fletch 12 Woodlea Mildenhall MAF
如果一個檔案與另一個檔案沒有比對域時怎麼辦?這時j o i n不可以沒有參數選項,經常指
定兩個檔案的- a選項。下面的例子顯示比對及不比對域。
輸出表明P. H e l l e r不比對第二個檔案中任何一個記錄。再運作這個指令,但指定隻顯示第
一個檔案中不比對行和比對行:
[[email protected] huangcd]# join -a1 -a2 names.txt town.txt
M.Golls 12 Hidd Rd Norwich NRD
P.Heller The Acre
P.Willey 132 The Grove Galashiels GDD
T.Norms 84 Connaught Rd Brandon BSL
K.Fletch 12 Woodlea Mildenhall MAFi
使用- o選項選擇連接配接域。例如要建立一個檔案僅包含人名及城鎮, j o i n執行時需要指定顯
示域。方式如下:
使用1 . 1顯示第一個檔案第一個域,2 . 2顯示第二個檔案第二個域,其間用逗号分隔。指令為:
[[email protected] ~]# join -o 1.1,2.2 names.txt town.txt
M.Golls Norwich
P.Willey Galashiels
T.Norms Brandon
K.Fletch Mildenhall
要建立此新檔案,将輸出結果重定向到一個檔案即可。
[[email protected] ~]# join -o 1.1,2.2 names.txt town.txt >towns.txt
使用-jn m進行其他域連接配接,例如用檔案1域3和檔案域2做連接配接鍵,指令為:
join -j 1 3 -j 2 2 file1 file2
下面觀察一個具體執行個體。有兩個檔案:
[[email protected] huangcd]# cat pers
P.Jones Office Runner ID897
S.Round UNIX admin ID666
L.Clip Presonl Chief ID892
[[email protected] huangcd]# cat pers2
Dept2C ID897 6 years
Dept3S ID666 2 years
Dept5Z ID982 1 year
檔案p e r s包括名字、工作性質和個人I D号。檔案p e r s 2包括部門、個人I D号及工齡。連接配接
應使用檔案p e r s中域4,比對檔案p e r s 2中域2,指令及結果如下:
[[email protected] huangcd]# join -j1 4 -j2 2 pers pers2
ID897 P.Jones Office Runner Dept2C 6 years
ID666 S.Round UNIX admin Dept3S 2 years
使用j o i n應注意連接配接域到底是哪一個,比如說你認為正在通路域4,但實際上j o i n應該通路
域5,這樣将不傳回任何結果。如果是這樣,用a w k檢查域号。例如,鍵入$ awk '{print $4}'文
件名,觀察其是否比對假想域。