如何用AWK预处理多列能量分解数据以适配柱状图绘制
能量分解数据转两列格式的AWK脚本优化
问题背景
处理多列能量分解分析数据时,需要转换为两列格式用于柱状图绘制,具体需求:
- 将第一列(Residue)的连续空格替换为下划线,如
SER 1改为SER_1 - 移除最后一列(TOTAL)的误差信息,如
0.000 +/- 0.001改为0.000
原AWK脚本因TOTAL列包含误差信息,导致数值判断条件($8 > 0.005)无法生效,且未完成格式转换。
原数据示例
| Run on Thu Oct 20 14:59:37 2022 || GB non-polar solvation energies calculated with gbsa=2 idecomp = 1: Per-residue decomp adding 1-4 interactions to Internal. Energy Decomposition Analysis (All units kcal/mol): Generalized Born solvent DELTAS: Total Energy Decomposition: Residue | Location | Internal | van der Waals | Electrostatic | Polar Solvation | Non-Polar Solv. | TOTAL ------------------------------------------------------------------------------------------------------------------------------------------------------- SER 1 | R SER 1 | 0.000 +/- 0.000 | -0.000 +/- 0.000 | -0.092 +/- 0.012 | 0.092 +/- 0.012 | 0.000 +/- 0.000 | 0.000 +/- 0.001 GLY 2 | R GLY 2 | 0.000 +/- 0.000 | -0.000 +/- 0.000 | 0.001 +/- 0.001 | -0.001 +/- 0.001 | 0.000 +/- 0.000 | 0.000 +/- 0.001
原脚本
awk -F "|" ' BEGIN { print "@TYPE bar" } NR > 9 && $8 > 0.005 { print $1, $8 } ' $file > output_data.dat
原输出问题:保留了误差信息,第一列未替换空格,数值判断逻辑失效。
解决方案
修改后的AWK脚本:
awk -F "|" ' BEGIN { print "@TYPE bar" } NR > 9 { # 处理第一列:替换连续空格为下划线,清理首尾多余下划线 gsub(/[[:space:]]+/, "_", $1) gsub(/^_+|_+$/, "", $1) # 处理第八列:拆分出主数值,剔除误差部分 split($8, total_parts, /[[:space:]]+\+\/-/) total_val = total_parts[1] # 清理数值前后空白 gsub(/^[[:space:]]+|[[:space:]]+$/, "", total_val) # 筛选绝对值大于0.005的条目(可按需调整) if (total_val > 0.005 || total_val < -0.005) { printf "%-10s %s\n", $1, total_val } } ' $file > output_data.dat
脚本说明
- 第一列格式修正:用
gsub把连续空格替换为下划线,再去除首尾多余的下划线,得到SER_1的规范格式。 - 第八列数值提取:通过
split按+/-分割字符串,提取第一部分作为纯数值,确保后续判断基于有效数值。 - 数值判断优化:调整为判断绝对值大于0.005的条目(可根据需求修改阈值),避免因负数值被遗漏。
- 对齐输出:用
printf控制列宽,保证输出格式规整,适配柱状图数据要求。
期望输出示例
@TYPE bar SER_1 0.000 GLY_2 0.000 PHE_3 0.000 ARG_4 0.003 LYS_5 0.019 ... VAL_18 -0.058
内容的提问来源于stack exchange,提问作者James Starlight
相关产品推荐
相关产品推荐

