Awk:基于公共字段将拆分字段元素从一个文件连接到另一个文件

时间:2016-03-22 21:49:39

标签: awk

我有两个制表符分隔的文件f1f2,如下所示:

f1:

id1    r1
id2    r2
id3    r3
...
idN    rN

f2:

f1    g1    x1;id1
f2    g2    x2;id2
f4    g4    x2;id4
...
fM    gM    xm;idM

其中NM可能不同。我正在寻找创建f1的关联数组,并将f1的第二列连接到f2的末尾,以便输出为:

f1    g1    x1;id1=r1
f2    g2    x2;id2=r2
...

作为测试,我运行了这个:

awk 'BEGIN{FS=OFS="\t"} NR==FNR{id[$1]=$1; r[$1]=$2; next} {split($3,a,";"); if (a[2] in id) {print "found"} else {print "not found"}}' f1 f2

给出输出:

 found
 found
 not found
 ...

但是,运行以下命令:

awk 'BEGIN{FS=OFS="\t"} NR==FNR{id[$1]=$1; r[$1]=$2; next} {split($3,a,";"); if (a[2] in id) {$3=$3"="r[$1]; print} else {print "not found"}}' f1 f2

给出输出:

f1      g1      x1;id1=
f2      g2      x2;id2=
not found
...

我的问题是:如何访问与密钥相关联的值,以便我可以将其附加到f2的第3列?

1 个答案:

答案 0 :(得分:1)

join是用于加入文件的工具,特别是如果它们已经按键排序。

$ join -14 <(sed 's/;/; /' file2) file1 | 
   awk '{print $2,$3,$4$1 "=" $5}' 

f1 g1 x1;id1=r1
f2 g2 x2;id2=r2

但是,您的输出格式不是标准格式,因此需要awk。我想在这种情况下,整个脚本也可以在awk中完成。