从两个文件中添加awk中的列

时间:2013-10-08 08:55:43

标签: join awk

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

档案A

chr1   123 aa b c d
chr1   234 a  b c d
chr1   345 aa b c d
chr1   456 a  b c d
....

档案B

chr1   123    aa    c    d    e   ff
chr1   345    aa    e    f    g   gg
chr1   123    aa    c    d    e   hh
chr1   567    aa    z    c    a   ii
chr1   345    bb    x    q    r   kk
chr1   789    df    f    g    s   ff
chr1   345    sh    d    t    g   ll

...

我想基于2个键列“chr1”,“123”从文件B向文件A添加新列,即(前两列是键列)。如果两个文件中的键列匹配,则应将文件B中第7列中的数据添加到文件A中的第3列。

例如(chr1 123)键在文件B中找到两次,因此文件A中的第3列有ff,hh用逗号分隔。如果找不到密钥,则应该输入NA,输出应如下所示: 输出:

chr1   123  ff,hh       aa    b    c    d   
chr1   234    NA        a     b    c    d
chr1   345  gg,kk,ll    aa   b    c    d
chr1   456    NA        a    b    c     d

我通常在R中这样做但是大型数据集需要花费大量时间。有人可以提供awk解决方案来加速任务吗?

1 个答案:

答案 0 :(得分:1)

尝试这个awk行:

awk -F'\t' -v OFS='\t' 'NR==FNR{a[$1FS$2]=a[$1FS$2]?a[$1FS$2]","$7:$7;next}
{$3=(($1FS$2 in a)?a[$1FS$2]:"NA")FS $3}7' fileB fileA