我有两个数据文件,每个文件有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
答案 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使用选项卡作为输出字段分隔符。