我正在处理一些典型的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方式可以做到这一点吗?
谢谢。
答案 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