具有重复值的 VLOOKUP()

VLOOKUP() with repeated values

我正在处理一些典型的 VLOOKUP 问题,但由于重复的行而相当困难...

我有两个文件,例如:

文件 1

transcript1     miR1
transcript1     miR2
transcript2     miR5
transcript2     miR4 
transcript2     miR1
transcript2     miR2
transcript3     miR5
transcript4     miR2

文件 2

transcript1     gene1
transcript2     gene1
transcript3     gene2
transcript4     gene2

我想给文件1中的转录本分配基因名,根据文件2得到:

transcript1     miR1    gene1
transcript1     miR2    gene1
transcript2     miR5    gene1
transcript2     miR4    gene1
transcript2     miR1    gene1
transcript2     miR2    gene1
transcript3     miR5    gene2
transcript4     miR2    gene2

我通常使用 OpenOffice 或 Excel 中的 VLOOKUP() 函数执行此任务,将 file2 粘贴到 file1 电子表格中。

但是这个函数似乎不适用于查找矩阵(文件 1 的第 1 列)中的重复行...

有谁知道这样做的方法吗?看似简单却想不通...

有任何 AWK、BASH、Excel/OpenOffice 方法吗?

谢谢。

您可以使用 join:

join file1 file2

输出(基于您的示例输入):

transcript1 miR1 gene1
transcript1 miR2 gene1
transcript2 miR5 gene1
transcript2 miR4 gene1
transcript2 miR1 gene1
transcript2 miR2 gene1
transcript3 miR5 gene2
transcript4 miR2 gene2

重要提示:必须对两个文件进行排序才能使 join 正常工作。 未排序的文件可以即时排序:

join <(sort file1) <(sort file2)

如果你的shell不支持命令替换,你可以使用临时中间文件:

sort file1 > sorted1
sort file2 > sorted2
join sorted1 sorted2

无论您的输入文件是否排序,这都有效:

$ awk 'NR==FNR{a[]=;next} {print [=10=], a[]}' file2 file1
transcript1     miR1 gene1
transcript1     miR2 gene1
transcript2     miR5 gene1
transcript2     miR4 gene1
transcript2     miR1 gene1
transcript2     miR2 gene1
transcript3     miR5 gene2
transcript4     miR2 gene2