在UNIX中基于字段连接两个文件

时间:2013-01-01 16:18:46

标签: linux shell unix join merge

我有一个要求,其中fileA包含具有多个列的行列表,其中一列是emaillist,其名称为emaillist[1,2,3,..]。我已经定义了另一个文件fileB,我在其中为emailist[1,2,3,..]变量赋值。我看了fileA,想要阅读emailist中定义的fileB

FILEA:

XXX1 YYY1 emailist1
XXX2 YYY2 emailist2

FILEB:

emailist1=abcd@xyz.com 
emailist2=xyz@zbc.com

Shell脚本:

Read fileA

email = $3

以下是我的挑战,如何阅读emailist1中定义的fileB

2 个答案:

答案 0 :(得分:3)

使用join命令:

$ cat fileA
XXX1 YYY1 emailist1
XXX2 YYY2 emailist2

$ cat fileB
emailist1 abcd@xyz.com 
emailist2 xyz@zbc.com

$ join -1 3 -2 1 -o '1.1 1.2 2.2' <(sort fileA -k3,3) <(sort fileB)
XXX1 YYY1 abcd@xyz.com 
XXX2 YYY2 xyz@zbc.com

join命令要求首先对数据进行排序,以便我们sortemaillist归档,然后column 3加入file 1 column 1 } file 2-1 3 -2 1-o选项用于以相同的方式指定要输出的字段,因为您没有明确指定我认为来自fileA的字段1和来自fileB的字段2: 1.1 1.2 2.2

注意:将=更改为fileB中的空格,如sed 's/=/ /' fileB

答案 1 :(得分:1)

您需要首先阅读fileB并将值添加到关联数组中,然后在读取fileA时,将第三列替换为数组中的值。使用awk

可以轻松实现此逻辑
awk 'FNR==NR { sub(/=/," "); a[$1]=$2; next } $3 in a { $3=a[$3] }1' fileB fileA

结果:

XXX1 YYY1 abcd@xyz.com
XXX2 YYY2 xyz@zbc.com