天天看點

linux shell程式設計指南第十一章------------合并與分割1

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}'文

件名,觀察其是否比對假想域。

繼續閱讀