您的位置:首页 > 运维架构 > Shell

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

2013-11-30 15:46 549 查看
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}'文

件名,观察其是否匹配假想域。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: