VLOOKUP()具有重复值

时间:2019-04-04 19:47:29

标签: bash awk vlookup

我正在处理一些典型的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

我想根据文件2将基因名称分配给文件1中的转录本,以获得以下信息:

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电子表格中来执行此任务。

但是此功能似乎不适用于外观矩阵(file1的第1列)中的重复行...

有人知道这样做的方法吗?看起来很简单,但无法弄清楚...

任何AWK,BASH,Excel / OpenOffice方式可以做到这一点吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用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)

如果您的外壳不支持命令替换,则可以使用临时中间文件:

sort file1 > sorted1
sort file2 > sorted2
join sorted1 sorted2

答案 1 :(得分:0)

无论输入文件是否已排序,这都将起作用:

$ awk 'NR==FNR{a[$1]=$2;next} {print $0, a[$1]}' 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