下面讲述j o i n工作方式。这里有两个文件f i l e 1和f i l e2,当然已经分类。每个文件里都有一些元素与另一个文件相关。由于这种关系, j o in将两个文件连在一起,这有点像修改一个主文件,使之包含两个文件里的共同元素。
文本文件中的域通常由空格或t a b键分隔,但如果愿意,可以指定其他的域分隔符。一些系统要求使用j o i n时文件域要少于20,为公平起见,如果域大于2 0,应使用D B M S系统。
为有效使用j o i n,需分别将输入文件分类。
其一般格式为:
- join [options] input-file1 input-file2
选项:
an n 为一数字,用于连接时从文件n中显示不匹配行。例如, - a 1显示第一个文件的不匹配行,- a2为从第二个文件中显示不匹配行。
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。
- [sam@chenwy sam]$ 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
- [sam@chenwy sam]$ cat town.txt
- M.Golls Norwich NRD
- P.Willey Galashiels GDD
- T.Norms Brandon BSL
- K.Fletch Mildenhall MAF
- K.Firt Mitryl Mdt
连接两个文件
连接两个文件,使得名字支持详细地址。例如M . G o l l s记录指出地址为12 HiddRd。连接域为域0—名字域。因为两个文件此域相同, j o i n将假定这是连接域:
- [sam@chenwy sam]$ 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删除或去除连接键的第二次重复出现,这里即为名字域。
1. 不匹配连接
如果一个文件与另一个文件没有匹配域时怎么办?这时j o i n不可以没有参数选项,经常指定两个文件的-a选项。下面的例子显示匹配及不匹配域。
- [sam@chenwy sam]$ 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 MAF
- K.Firt Mitryl Mdt
- [sam@chenwy sam]$ join-a1names.txttown.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 MAF
2. 选择性连接
使用- o选项选择连接域。例如要创建一个文件仅包含人名及城镇, j o i n执行时需要指定显示域。方式如下:
使用1 . 1显示第一个文件第一个域,2 . 2显示第二个文件第二个域,其间用逗号分隔。命令为:
- [sam@chenwy sam]$ join -o 1.1,2.2 names.txt town.txt
- M.Golls Norwich
- P.Willey Galashiels
- T.Norms Brandon
- K.Fletch Mildenhall
使用-jn m进行其他域连接,例如用文件1域3和文件域2做连接键,命令为:
- [sam@chenwy sam]$ cat pers
- P.Jones Of fice Runner ID897
- S.Round UNIX admin ID666
- L.Clip Personl Chief ID982
- [sam@chenwy sam]$ 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 rs中域4,匹配文件p e r s 2中域2,命令及结果如下:
- [sam@chenwy sam]$ join -j1 4 -j2 2 pers pers2
- ID897 P.Jones Office Runner Dept2C 6 years
- ID666 S.Round UNIX admin Dept3S 2 years
- ID982 L.Clip Personl Chief Dept5Z 1 year
使用j o i n应注意连接域到底是哪一个,比如说你认为正在访问域4,但实际上j o in应该访问域5,这样将不返回任何结果。如果是这样,用a w k检查域号。例如,键入$ awk '{print$4}'文件名,观察其是否匹配假想域。