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

