在特定列中使用awk提取模式

在特定列中使用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

我想修改一个文件(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
仅获取最后一列中的模式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
    作为分隔符

  • substr(a[6],6)
    -从substring
    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
中的regex
gene=(\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命令中,仅将名称作为存储的模式。