现在的位置: 首页 > 综合 > 正文

linux shell编程指南第十一章————合并与分割1

2014年07月26日 ⁄ 综合 ⁄ 共 2193字 ⁄ 字号 评论关闭

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。

[root@localhost ~]# 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
[root@localhost ~]# 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将假定这是连接域:
[root@localhost ~]# 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不匹配第二个文件中任何一个记录。再运行这个命令,但指定只显示第
一个文件中不匹配行和匹配行:

[root@localhost 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显示第二个文件第二个域,其间用逗号分隔。命令为:

[root@localhost ~]# join -o 1.1,2.2 names.txt  town.txt 
M.Golls Norwich
P.Willey Galashiels
T.Norms Brandon
K.Fletch Mildenhall

要创建此新文件,将输出结果重定向到一个文件即可。

[root@localhost ~]# 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

下面观察一个具体实例。有两个文件:

[root@localhost huangcd]# cat pers
P.Jones Office Runner  ID897
S.Round UNIX   admin   ID666
L.Clip  Presonl Chief  ID892
[root@localhost 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,命令及结果如下:

[root@localhost 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}'文
件名,观察其是否匹配假想域。

抱歉!评论已关闭.