需要组合来自2个文件的列,其中1个文件在最终文件中每行有多个条目

时间:2016-04-30 18:28:07

标签: awk merge

我有两个数据文件,每个文件有2列,我需要将它们组合起来,以便从第一个文件中保留前两列,并在第二列与第一列匹配时附加第二个文件的第一列第一个文件的列。但是,可能有多个条目匹配每一行,并且它们都需要添加到同一行,用空格分隔。

文件1:

GO:0000001  mitochondrion|inheritance
GO:0000002  mitochondrial|genome|maintenance
GO:0000003  reproduction
GO:0000005  obsolete|ribosomal|chaperone|activity

文件2:

TMALIG_00480     GO:0000003
TMALIG_00489     GO:0000002
TMALIG_00499     GO:0000001
TMALIG_00499     GO:0000005
TMALIG_00500     GO:0000002

期望的输出:

GO:0000001  mitochondrion|inheritance   TMALIG_00499
GO:0000002  mitochondrial|genome|maintenance    TMALIG_00489 TMALIG_00500
GO:0000003  reproduction    TMALIG_00480
GO:0000005  obsolete|ribosomal|chaperone|activity   TMALIG_00499

我尝试过以下代码,它只返回文件1中的值,而不从文件2中添加任何代码:

awk -F '\t' 'FR==FNR { a[$2]=1; next} {print $1, $2, a[$1]}' go.db.txt TMALIG_GOids.txt

GO:0000001  mitochondrion|inheritance
GO:0000002  mitochondrial|genome|maintenance
GO:0000003  reproduction
GO:0000005  obsolete|ribosomal|chaperone|activity

1 个答案:

答案 0 :(得分:1)

你很亲密:

$ awk -F '\t' 'NR==FNR { a[$2]=($2 in a?a[$2]" ":"")$1; next} {print $1, $2, a[$1]}' OFS='\t' file2 file1
GO:0000001      mitochondrion|inheritance       TMALIG_00499
GO:0000002      mitochondrial|genome|maintenance        TMALIG_00489 TMALIG_00500
GO:0000003      reproduction    TMALIG_00480
GO:0000005      obsolete|ribosomal|chaperone|activity   TMALIG_00499

如何运作

  • -F '\t'

    这会将输入中的字段分隔符设置为选项卡。

  • NR==FNR { a[$2]=($2 in a?a[$2]"\t":"")$1; next}

    这会将file2中的信息捕获到关联数组a

    这里棘手的部分是,如果a[$1]已经有一个条目,我们会在现有条目之后附加一个空格和字段1 $1。否则,a[$2]只会设置为$1。这是在三元声明的帮助下完成的。

  • print $1, $2, a[$1]

    这将打印出新行,并在行尾添加file2中的值。

  • OFS='\t'

    这告诉awk使用选项卡作为输出字段分隔符。