2016-12-06 32 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

相关问题