2015-09-25 30 views
1

我有两个文件 - 一个是包含基因变体的大文件,多个列由制表符分隔。含有该基因的名称列可以包含一个名称,或由逗号分隔的多个名称(例如,在基因名称是SAMD11和NOC2L):当第二个文件列包含逗号时,使用awk将一个文件的列与另一个文件的列匹配

1 874816 874816 - T rs200996316 SAMD11 exonic ENSG00000187634 frameshift insertion 
1 878331 878331 C T rs148327885 SAMD11 exonic ENSG00000187634 nonsynonymous SNV 
1 879676 879676 G A rs6605067 NOC2L,SAMD11 UTR3 ENSG00000187634,ENSG00000188976 
1 879687 879687 T C rs2839 NOC2L,SAMD11 UTR3 ENSG00000187634,ENSG00000188976 
1 881918 881918 G A rs35471880 NOC2L exonic ENSG00000188976 nonsynonymous SNV 
1 888659 888659 T C rs3748597 NOC2L exonic ENSG00000188976 nonsynonymous SNV 

第二个文件是基因名称的单个列列表,如这个:

EVC2 
SAMD11 
COMT 

我想匹配第二个文件中的基因名称与第一个文件中的基因名称。我目前使用的AWK:

awk -F $'\t' 'BEGIN { while(getline <"secondfile.txt") gene[$0]=1; } gene[$7]' firstfile.txt > newfile.txt 

然而,这仅仅打印精确匹配,从而不打印与NOC2L,SAMD11行。从上面的例子中,预期产出将是第一个文件的前四行:

1 874816 874816 - T rs200996316 SAMD11 exonic ENSG00000187634 frameshift insertion 
1 878331 878331 C T rs148327885 SAMD11 exonic ENSG00000187634 nonsynonymous SNV 
1 879676 879676 G A rs6605067 NOC2L,SAMD11 UTR3 ENSG00000187634,ENSG00000188976 
1 879687 879687 T C rs2839 NOC2L,SAMD11 UTR3 ENSG00000187634,ENSG00000188976 

我想它还是做精确匹配,因为一些基因的名字可以是相似的 - 例如,有可能是一个基因称为SAMD1,如果我做了模糊匹配,那么我会得到SAMD1,SAMD11等。所以我需要一些确实匹配的东西,但忽略基因名称列中的逗号,或将其视为字段分隔符或类似字符。

在此先感谢。

+0

谢谢,已经这样做了。 –

回答

3
$ cat tst.awk 
NR==FNR { genes[$0]; next } 
{ 
    split($7,a,/,/) 
    for (i in a) { 
     if (a[i] in genes) { 
      print 
      next 
     } 
    } 
} 

$ awk -f tst.awk secondfile.txt firstfile.txt 
1 874816 874816 - T rs200996316 SAMD11 exonic ENSG00000187634 frameshift insertion 
1 878331 878331 C T rs148327885 SAMD11 exonic ENSG00000187634 nonsynonymous SNV 
1 879676 879676 G A rs6605067 NOC2L,SAMD11 UTR3 ENSG00000187634,ENSG00000188976 
1 879687 879687 T C rs2839 NOC2L,SAMD11 UTR3 ENSG00000187634,ENSG00000188976 

这也将工作:

$ cat tst.awk 
NR==FNR { genes[$0]; next } 
{ 
    for (gene in genes) { 
     if ($7 ~ "(^|,)"gene"(,|$)") { 
      print 
      next 
     } 
    } 
} 
+1

谢谢,那有效!我可以问一下拆分中的'a'在做什么吗? –

+0

这就是'split()'正在填充的数组的名称。 man awk并查找'split()'。我将为你发布一些替代方案 - 可能是一个很好的介绍,让你看到解决问题的一些不同方法。注 - 它们都不涉及getline! –

相关问题