使用awk提取GFF文件中的特定模式
嘿,处理大体积GFF文件用awk绝对是个高效的选择——毕竟awk天生就是为逐行处理文本而生,内存占用极低,完全hold得住大文件。我给你几个实用的提取方案,你可以根据自己需要的特定模式来选:
1. 提取特定基因的所有CDS
比如你想把gene_id "g57"对应的所有CDS行都提出来,可以用这个命令:
$9 ~ /gene_id "g57";/ {print $0}
这里的逻辑是:第9列是GFF的属性列,只要这一列包含gene_id "g57";,就输出整行。如果担心属性列里的字段顺序不固定,这个匹配方式也能精准命中,不会漏。
要是你想更严谨(比如避免其他字段意外匹配到这个字符串),也可以用整词匹配的写法:
$9 ~ /(^| )gene_id "g57";/ {print $0}
2. 提取指定scaffold的所有CDS
比如只保留scaffold_32上的CDS记录,利用GFF的列特性(第1列对应scaffold名称,第3列是特征类型):
$1 == "scaffold_32" && $3 == "CDS" {print $0}
这个命令会精准筛选出符合scaffold和特征类型的行,排除无关内容。
3. 提取特定转录本的CDS
如果需要针对某个转录本(比如transcript_id "g57.t1")提取CDS,逻辑和提取基因类似:
$9 ~ /transcript_id "g57.t1";/ {print $0}
4. 只提取关键字段(精简输出)
要是你不需要整行内容,只想保留核心信息(比如scaffold名、CDS起始/终止位置、基因ID),可以用这个脚本拆分属性列:
$3 == "CDS" { # 把第9列的属性按分号拆分 split($9, attrs, /;/); # 遍历属性找gene_id for (i in attrs) { if (attrs[i] ~ /gene_id/) { # 去掉gene_id的引号和前缀 gsub(/gene_id "/, "", attrs[i]); gsub(/"$/, "", attrs[i]); gene_id = attrs[i]; break; } } # 输出需要的字段 print $1, $4, $5, gene_id; }
运行后会得到类似这样的精简结果:
scaffold_32 8973 9290 g57 scaffold_32 11374 11507 g57 scaffold_32 11586 11733 g57
处理超大文件的小提示
- 直接用awk处理原文件就行,不用提前把整个文件读入内存,awk逐行处理的特性完全适配大文件
- 如果你的GFF是压缩格式(比如
.gff.gz),可以结合zcat直接处理,不用解压整个文件:zcat your_file.gff.gz | awk '$9 ~ /gene_id "g57";/ {print $0}'
内容的提问来源于stack exchange,提问作者Grendel
相关产品推荐
相关产品推荐

