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

AWK脚本开发需求:比对$4字段p.开头子串并修改格式

完整AWK解决方案:处理AAChange.refGene字段的氨基酸突变格式

嘿,我来帮你搞定这个AWK脚本的需求!咱们先把需求再理清楚一遍,确保没遗漏:

  • 你的输入是制表符分隔的大文件,50列、约1万行
  • 只需要处理第4字段(AAChange.refGene)里那些以p.开头的子串
  • 目标子串的格式是固定的:p.XXXNNNNYYY(XXX是3个字母的氨基酸缩写,NNNN是1-4位数字,YYY也是3个字母)
  • 如果前后两个3字母的氨基酸缩写完全相同,就把这个子串改成p.XXXNNNN=;要是不一样,就保持原行不动

完整AWK代码

BEGIN {
    FS = "\t"  # 把输入字段分隔符设为制表符
    OFS = "\t" # 输出也用制表符,保证和原文件格式一致
}

# 处理每一行数据
{
    # 先判断第4字段是不是完全符合我们要找的格式
    if ($4 ~ /^p\.[A-Za-z]{3}[0-9]{1,4}[A-Za-z]{3}$/) {
        # 用match函数把前后字母和中间数字拆出来,存在parts数组里
        match($4, /p\.([A-Za-z]{3})([0-9]{1,4})([A-Za-z]{3})/, parts)
        
        # 比对前后两个3字母的氨基酸缩写
        if (parts[1] == parts[3]) {
            # 相同的话就替换成要求的格式
            $4 = "p." parts[1] parts[2] "="
        }
        # 不一样的话啥也不用做,保持原字段就行
    }
    # 不管改没改,都输出整行
    print $0
}

代码逻辑拆解

我给你逐部分解释下这段代码怎么工作:

  1. BEGIN块:一开始就把输入和输出的字段分隔符都设为制表符,这样处理完的文件格式和原文件完全一致,不会乱掉。
  2. 行判断:用正则表达式/^p\.[A-Za-z]{3}[0-9]{1,4}[A-Za-z]{3}$/检查第4字段是不是严格符合我们要的格式——避免匹配到那些带额外字符的子串(比如后面加了分号的情况)。
  3. 拆分字段:match()函数配合捕获组,把p.后面的3字母、中间的数字、最后3字母分别提取到parts[1]、parts[2]、parts[3]里,这样比对和替换就方便多了。
  4. 替换逻辑:如果前后两个3字母相同,就把第4字段改成p.XXX数字=的格式;不同的话就跳过,保持原样。
  5. 输出:不管有没有修改,都输出整行,保证所有行都被保留,不会丢数据。

示例验证

咱们用实际例子测试下,确保代码能正常工作:

输入示例(制表符分隔)

col1	col2	col3	p.Ala123Ala	col5	...
col1	col2	col3	p.Ser456Phe	col5	...
col1	col2	col3	p.Leu78Leu	col5	...

输出示例(制表符分隔)

col1	col2	col3	p.Ala123=	col5	...
col1	col2	col3	p.Ser456Phe	col5	...
col1	col2	col3	p.Leu78=	col5	...

额外说明

如果你的第4字段里有多个p.开头的子串(比如p.Ala123Ala;p.Ser456Phe这种用分号分隔的情况),上面的代码只会处理完全匹配格式的单个子串。要是需要处理多子串的场景,随时说,我再给你调整代码!另外,正则里的[A-Za-z]兼容大小写的氨基酸缩写,如果你的数据是严格大写或者小写,可以改成[A-Z]或[a-z],能稍微提升点匹配效率。

内容的提问来源于stack exchange,提问作者justaguy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:12:55