在特定列中使用awk提取模式
我想修改一个文件(gff3格式),只取最后一列的一个特定部分强> 我的文件如下所示,其中有九列由制表符空格分隔: NW_015494524.1格诺蒙CD 1220137 1220159。-0id=cds20267;父母=rna22739;Dbxref=GeneID:107513619,Genbank:XP_016006018.1;Name=XP_016006018.1;gbkey=CDS;基因=A3GALT2;产品=alpha_1%2C3-半乳糖基转移酶_2蛋白质_id=XP_016006018.1 我只想提取最后一列($9)中的基因名(;gene=XXX;)。 输出: NW_015494524.1格诺蒙CD 1220137 1220159。-0 A3GALT2 完成后,我想将第4、5、7、8列和从第9列中提取的值合并到一个唯一的列中 预期产出: A3GALT2 1220137 1220159-0 我尝试使用在特定列中使用awk提取模式,awk,Awk,我想修改一个文件(gff3格式),只取最后一列的一个特定部分 我的文件如下所示,其中有九列由制表符空格分隔: NW_015494524.1格诺蒙CD 1220137 1220159。-0id=cds20267;父母=rna22739;Dbxref=GeneID:107513619,Genbank:XP_016006018.1;Name=XP_016006018.1;gbkey=CDS;基因=A3GALT2;产品=alpha_1%2C3-半乳糖基转移酶_2蛋白质_id=XP_016006018.1
awk
仅获取最后一列中的模式gene=xxxx。我的基因名是大写字母,带数字或不带数字;并用“;”分隔第九列中的分号
awk FS "[ \t]" '$9 ~/gene=[A-Z0-9]$/ {print $0, $4, $5, $7, $8}' <file>
awk FS“[\t]”“$9~/gene=[A-Z0-9]$/{print$0、$4、$5、$7、$8}”
它不起作用。使用awk
或者sed
或者grep
有没有其他更好的方法
提前感谢您的帮助。以下awk也会对您有所帮助
awk '{sub(/.*gene=/,"",$(NF-1));sub(/\;.*/,"",$(NF-1));$NF=""} 1' Input_file
awk '$9 ~ /.*gene=/{sub(/.*gene=/,"",$(NF-1));sub(/\;.*/,"",$(NF-1));print $9,$4,$5,$7,$8} ' Input_file
输出如下
NW_015494524.1 Gnomon CDS 1220137 1220159 . - 0 A3GALT2
A3GALT2 1220137 1220159 - 0
编辑:正如我在评论中提到的那样,我不清楚您需要哪种输出,以防您需要第二次显示的输出,以下输出可能会对您有所帮助
awk '{sub(/.*gene=/,"",$(NF-1));sub(/\;.*/,"",$(NF-1));$NF=""} 1' Input_file
awk '$9 ~ /.*gene=/{sub(/.*gene=/,"",$(NF-1));sub(/\;.*/,"",$(NF-1));print $9,$4,$5,$7,$8} ' Input_file
输出如下
NW_015494524.1 Gnomon CDS 1220137 1220159 . - 0 A3GALT2
A3GALT2 1220137 1220159 - 0
awk解决方案:
awk '{ split($9,a,";"); print substr(a[6],6),$4,$5,$7,$8 }' file
-使用split($9,a,“;”)
将第9个字段拆分为块数组
代码>作为分隔符a
-从substringsubstr(a[6],6)
gene=XXXXXXXX中提取所需的基因名
A3GALT2 1220137 1220159 - 0
一个简单的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
中的regexgene=(\w+);
和捕获组(\w+)
将存储在数组a
中,仅此而已。感谢您的回复和帮助。是的,我希望输出为您所做的。仅保留基因名称、位置、链和相位信息。它们将用作新fasta序列的标题。我将尝试这些命令。您希望输出为NW_015494524.1 Gnomon CDS 1220137 1220159.-0 A3GALT2
或NW_015494524.1 Gnomon CDS 1220137 1220159.-0
,请向我们解释更多?是的,对不起。我想分两部分进行,但我可以一次完成。我想要基因名称、位置、链和相位。感谢解决方案。谢谢。好的,排除我需要ad()的数组的基因=吗关于基因名。如果我不放一个,捕获存储默认是在数组$0中吗?@Nico64:您不必在源输入文件中放()
。()match
函数中的
告诉我们如何捕获paranthesis中提到的模式。另外,如果我们没有在match
函数中指定a
,那么它将不会被存储,但我们可以使用RSTART
和RLENGTH
参数,这些参数在调用match
函数时默认设置。RSTART
表示第一个匹配字符的索引,如果不匹配,则为0;如果不匹配,则为长度,-1。好的。是的,对于括号,我的意思不是在infle中,而是在awk命令中,仅将名称作为存储的模式。