2015-09-25 34 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! –

相關問題