繁体   English   中英

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

[英]Extract a pattern using awk in a specific column

我想通过只取最后一列的一个特定部分来修改文件(gff3格式)!

我的文件看起来像这样,九个列由制表符空格分隔:

NW_015494524.1 Gnomon 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列和第9列中提取的值组合在一个唯一的列中。预期输出:

A3GALT2 1220137 1220159 - 0

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

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

它不起作用。 还有另一种方法可以用awksedgrep做得更好吗?

感谢您的帮助。

以下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

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); :这将匹配正则表达式gene=(\\w+); $9和捕获组(\\w+)将存储在数组a ,就是这样。

感谢您的回复和帮助。 是的,我想要你输出的输出。 仅保留基因名称,位置,链和相位信息。 它们将被用作新的fasta seqs的标题。 我会尝试这些命令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM