2017-10-21 209 views
3

我想通过只取最后一列的一个特定部分来修改文件(gff3格式)!在特定列中使用awk提取模式

我的文件看起来像这样与标签空格分隔的九列:

NW_015494524.1时针CDS 1220137 1220159。 - 0 ID = cds20267; Parent = rna22739; Dbxref = GeneID:107513619,Genbank:XP_016006018.1; Name = XP_016006018.1; gbkey = CDS; gene = A3GALT2; product = alpha_1%2C3-galactosyltransferase_2 protein_id = XP_016006018.1

我想只提取出现在最后一列($ 9)中的我的基因名称(; gene = XXX;)。输入:

NW_015494524.1 Gnomon CDS 1220137 1220159。 - 0 A3GALT2

后这个工作,我想列4,5,7,8和九关口提取值的唯一列 期望输出相结合:

A3GALT2 1220137 1220159 - 0

我试图使用awk在最后一列中只采用模式gene = xxxx。我的基因名称是带或不带数字的大写字母;并以';'分隔分号在第九列。

awk FS "[ \t]" '$9 ~/gene=[A-Z0-9]$/ {print $0, $4, $5, $7, $8}' <file> 

它不工作。是否有另外一种方法可以与awksedgrep比较好?

感谢您提前给予帮助。

+0

您希望输出为NW_015494524.1 Gnomon CDS 1220137 1220159。 - 0 A3GALT2'或'NW_015494524.1 Gnomon CDS 1220137 1220159。 - 0',请给我们解释一下吗? – RavinderSingh13

+0

对不起。我想分两部分来做,但我可以一次完成。我想要基因名称,位置,链和阶段。感谢解决方案。 – Nico64

回答

2

以下awk应该帮助你。

awk '{sub(/.*gene=/,"",$(NF-1));sub(/\;.*/,"",$(NF-1));$NF=""} 1' Input_file 

输出如下。

NW_015494524.1 Gnomon CDS 1220137 1220159 . - 0 A3GALT2 

编辑:正如我在评论中曾提到过我很困惑,你的情况下,需要哪些输出,你需要你的第二个显示输出以下可能会帮助你一样。

awk '$9 ~ /.*gene=/{sub(/.*gene=/,"",$(NF-1));sub(/\;.*/,"",$(NF-1));print $9,$4,$5,$7,$8} ' Input_file 

输出如下。

A3GALT2 1220137 1220159 - 0 
1

AWK溶液:

awk '{ split($9,a,";"); print substr(a[6],6),$4,$5,$7,$8 }' file 
  • ​​- 析取所需基因 - 使用;作为分隔

  • substr(a[6],6)分裂第九字段成块a的阵列从子命名gene=XXXXXXXX

输出:

A3GALT2 1220137 1220159 - 0 
1

简单AWK溶液

$ awk '{match($9,/gene=(\w+);/,a); print a[1],$4,$5,$7,$8}' file 
A3GALT2 1220137 1220159 - 0 

{match($9,/gene=(\w+);/,a);:这将在$9匹配正则表达式gene=(\w+);和捕获组(\w+)这将存储在数组a中就是这样。

+0

谢谢。好的,以便将我需要的数组的基因排除在基因名称周围的ad()上。如果我不放一个,数组$ 0是默认捕获存储空间吗? – Nico64

+0

@ Nico64:你不必在你的源输入文件中加入'()'。 'match()函数中的'()'告诉捕获paranthesis中提到的模式。另外,如果我们没有在'match'函数中指定'a',那么它将不会被存储,但是我们可以使用'RSTART'和'RLENGTH'参数,这些参数在调用'match'函数时默认设置。 'RSTART'表示第一个匹配字符的索引,如果不匹配,则为0;如果不匹配,则为'RLENGTH',长度为-1。 – batMan

+0

好的。是的,对于括号,我的意思是不在我的基因名称在infile中,而是在awk命令中仅将名称作为存储的模式。 – Nico64

0

感谢您的回复和帮助。是的,我希望你的输出。只保留基因名称,位置,链和相位信息。它们将被用作新的fasta序列的头部。我会尝试这些命令。