join用来将来自两个分类文本文件的行连在一起。下面讲述join工作方式。这里有两个文件file1和file2,当然已经分类。每个文件里都有一些元素与另一个文件相关。由于这种关系,join将两个文件连在一起,这有点像修改一个主文件,使之包含两个文件里的共同元素。文本文件中的域通常由空格或tab键分隔,但如果愿意,可以指定其他的域分隔符。类似于数据库中的join。
其一般格式为:
join [options] input-file1 input-file2
让我们看看它的可用选项列表:
an n为一数字,用于连接时从文件n中显示不匹配行。例如, -a1显示第一个文件的不匹配行,-a2为从第二个文件中显示不匹配行。
o n.m n为文件号,m为域号。1.3表示只显示文件1第三域,每个n,m必须用逗号分隔,如1.3,2.1。
j n m n为文件号,m为域号。使用其他域做连接域。
t 域分隔符。用来设置非空格或tab键的域分隔符。例如,指定冒号做域分隔符-t:
例子:
wangnc> pg name.txt
M.Golls 12 Hidd Rd
P.Heller The Acre
P.Willey 132 The Grove
T.Norms 84 Connaught Rd
K.Fletch 12 Woodlea
wangnc> pg town.txt
M.Golls Norwich NRD
P.Willey Galashiels GDD
T.Norms Brandon BSL
K.Fletch Mildenhall MAF
wangnc>
连接两个文件,使得名字支持详细地址。例如M.Golls记录指出地址为12 Hidd Rd。连接域为域0—名字域。因为两个文件此域相同, join将假定这是连接域:
wangnc> join name.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
好,工作完成。缺省join删除或去除连接键的第二次重复出现,这里即为名字域。
如果一个文件与另一个文件没有匹配域时怎么办?这时join不可以没有参数选项,经常指定两个文件的-a选项。下面的例子显示匹配及不匹配域。
wangnc> join -a1 -a2 name.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
使用-o选项选择连接域。例如要创建一个文件仅包含人名及城镇, join执行时需要指定显示域。方式如下:
使用1.1显示第一个文件第一个域,2.2显示第二个文件第二个域,其间用逗号分隔。命令为:
wangnc> join -o 1.1,2.2 name.txt town.txt
M.Golls Norwich
P.Willey Galashiels
T.Norms Brandon
K.Fletch Mildenhall
使用-jn m进行其他域连接,例如用文件1域3和文件2域2做连接键,命令为:
join -j1 3 -j2 2 file1 file2
使用join应注意连接域到底是哪一个,比如说你认为正在访问域4,但实际上join应该访问域5,这样将不返回任何结果。如果是这样,用awk检查域号。
例如,键入$awk '{print $4}'文件名,观察其是否匹配假想域。