You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:27:57