Awk 需要合并两个文件中的列,其中一个文件在最终文件中每行有多个条目

Awk 需要合并两个文件中的列,其中一个文件在最终文件中每行有多个条目,awk,merge,Awk,Merge,我有两个数据文件,每个文件有两列,我需要将它们组合在一起,这样第一个文件中的前两列将被保留,当第二列与第一个文件的第一列匹配时,第二个文件的第一列将被追加。但是,可能有多个条目与每一行匹配,它们都需要添加到同一行,并用空格分隔 文件1: GO:0000001 mitochondrion|inheritance GO:0000002 mitochondrial|genome|maintenance GO:0000003 reproduction GO:0000005 obsolete|ri

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

文件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
你很接近:

$ 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]=(a中的$2?a[$2]“\t”:“)$1;next}

    这会将文件2中的信息捕获到关联数组
    a

    这里需要技巧的部分是,如果
    a[$1]
    已经有一个条目,我们会在现有条目之后附加一个空格和字段1,
    $1
    。否则,
    a[$2]
    仅设置为
    $1
    。这是通过三元语句实现的

  • 打印$1、$2、a[$1]

    这将打印新行,并将file2中的值附加到该行的末尾

  • OFS='\t'

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


谢谢!使基因ID空格分隔而不是标签的完整正确代码是
awk-F'\t''NR==FNR{a[$2]=(a?a[$2]“\t:”)$1;next}{print$1,$2,a[$1]}'OFS='\t'file2 file1 | perl-p-e's/(TCALIF\d+\t/$1/g'>file.out
@tiggersandrok。我更新了代码,使基因ID空间分隔。当您有两个变量必须设置为相同的文字值时,为了清晰和维护,最好将它们一起设置为该值,而不是分开设置,并且最好在使用它们之前(即在脚本开始时)显示它们已初始化而不是在使用它们之后(即在脚本末尾)。使用
awk'BEGIN{FS=OFS=“\t”}…”文件
而不是
awk-F'\t''.'OFS='\t'文件