使用awk处理文本文件:计算特定三字符序列的比值
用awk计算每个ID组内TTA与其他序列的数值比值
没问题,这就给你写一个针对性的awk脚本,完美处理你的需求——按ID分组,计算每个组里TTA的数值和其他所有3字符序列的数值比值。
核心思路
我们需要按ID分组处理数据:
- 识别每个ID组的起始,收集组内所有序列的数值
- 定位当前组中TTA对应的数值
- 遍历组内其他序列,计算比值并输出
- 处理完一个组后重置数据,继续下一组
完整awk脚本
把下面的内容保存成calculate_ratio.awk文件:
BEGIN { FS = "\t" # 设置字段分隔符为制表符,匹配你的数据格式 } # 匹配ID开头的行,处理新组 /^ID/ { # 先处理上一个ID组的数据(如果不是第一个组) if (current_id != "") { process_group() delete data # 清空数组,准备下一组 } current_id = $0 # 记录当前ID next } # 处理数据行,存入数组 { data[$1] = $2 } # 文件结束时,处理最后一个ID组 END { if (current_id != "") { process_group() } } # 定义处理组的函数,复用代码 function process_group() { print "==== " current_id " ====" # 检查当前组是否有TTA if ("TTA" in data) { tta_val = data["TTA"] # 遍历所有序列,计算比值 for (seq in data) { if (seq != "TTA") { # 这里是 TTA数值 / 其他序列数值,按需调整顺序 ratio = tta_val / data[seq] printf "TTA/%s = %.4f\n", seq, ratio # 如果需要反过来(其他/TTA),改成下面这两行: # ratio = data[seq] / tta_val # printf "%s/TTA = %.4f\n", seq, ratio } } } else { print "⚠️ 该组未找到TTA序列" } print "" # 输出空行分隔不同组,提升可读性 }
使用方法
假设你的数据文件名为input.txt,在终端运行:
awk -f calculate_ratio.awk input.txt
示例输出
用你提供的示例数据运行后,输出会是这样:
==== ID1 ==== TTA/AAA = 0.1765 TTA/ATA = 0.5000 TTA/ATC = 0.2500 TTA/AAG = 0.3333 TTA/ACA = 0.2308 TTA/ATG = 0.1429 TTA/ACC = 0.2308 TTA/ACG = 0.6000 TTA/AAT = 0.2500 TTA/AGA = 0.2727 TTA/ATT = 0.1364 TTA/AGC = 0.2727 TTA/TAA = 1.0000 TTA/ACT = 0.3750 TTA/TAC = 0.2500 ==== ID2 ==== ⚠️ 该组未找到TTA序列
注意事项
- 如果你的数据分隔符不是制表符,修改
BEGIN块里的FS值即可(比如空格分隔改成FS = " ") - 比值的小数位数可以通过
printf里的%.4f调整,比如%.2f就是保留两位小数 - 脚本里已经注释了反向比值的写法,按需替换就行
内容的提问来源于stack exchange,提问作者user7249622
相关产品推荐
相关产品推荐

