2016-12-06 25 views
-1

在下面的awk我想捕捉的KCNMA1所有條件來過濾文件,在gene行(這是名稱的一個列的列表),它們在file$8這是tab-delimitedawk的使用另一個捕獲所有實例

因此,在下面的示例中,KCNMA1出現在$8中的所有實例/行將打印到output

也可能有多個;,但是名稱(在此例中爲KCNMA1)將包含在內。 awk似乎捕獲了可能的4個條件中的2個,但並非如當前輸出所示的所有實例。謝謝 :)。

基因

KCNMA1 

文件

R_Index Chr Start End Ref Alt Func.IDP.refGene Gene.IDP.refGene GeneDetail.IDP.refGene 
4629 chr10 78944590 78944590 G A intergenic NONE;KCNMA1 dist=NONE;dist=451371 
4630 chr10 79396463 79396463 C T intronic KCNMA1 . 
4631 chr10 79397777 79397777 C - exonic KCNMA1;X1X . 
4632 chr10 81318663 81318663 C G exonic SFTPA2 . 
4633 chr10 89397777 89397777 - GAA exonic NONE;X1X;KCNMA1 . 

電流輸出

R_Index Chr Start End Ref Alt Func.IDP.refGene Gene.IDP.refGene GeneDetail.IDP.refGene 
1 chr10 79396463 79396463 C T intronic KCNMA1 . 
2 chr10 79397777 79397777 C - exonic KCNMA1;X1X . 

期望的輸出tab-delimeted

R_Index Chr Start End Ref Alt Func.IDP.refGene Gene.IDP.refGene GeneDetail.IDP.refGene 
4629 chr10 78944590 78944590 G A intergenic NONE;KCNMA1 dist=NONE;dist=451371 
4630 chr10 79396463 79396463 C T intronic KCNMA1 . 
4631 chr10 79397777 79397777 C - exonic KCNMA1;X1X . 
4633 chr10 89397777 89397777 - GAA exonic NONE;X1X;KCNMA1 . 

AWK

awk -F'\t' 'NR==FNR{a[$0];next} FNR==1{print} {x=$8; sub(/;.*/,"",x)} x in a{$1=++c; print}' gene file > out 
+0

不知道爲什麼了' - 1',我還以爲包括了所有的細節,但編輯。謝謝 :)。 – Chris

+0

我認爲這適合你:awk'NR <2; $ 8〜/ KCNMA1 /'文件 –

回答

2

對於單基因,只是通過如您使用的是可變

$ awk -v gene='KCNMA1' -v d=';' 'NR==1 || d $8 d ~ d gene d' file 

櫃檯,因爲你想有似無必要第一場。

如果你想支持基於文件的基因列表,你可以使用這個

$ awk -v d=';' 'NR==FNR {genes[$0]; next} 
       FNR==1; 
         {for(g in genes) 
          if(d $8 d ~ d g d) print}' genes file 
+0

非常感謝。那麼'gene'每行中的所有文本都會讀入數組'g',而'd =;'會告訴'awk'每行中可能有';'。如果只是在'file'的'$ 8'中查找'g'中的任何字符串。我很抱歉,如果我的理解是關閉的,我正在努力學習。非常感謝:) – Chris

+1

這是爲了消除子串匹配,例如假設你在尋找「CNMA」,你不想與KCNMA1匹配。這對您的數據集可能不是問題,但最好是安全的。 – karakfa

+0

非常感謝,這有助於很多:)。 – Chris

相關問題