BASH中如何从外部文件提取可变ATOM编号并存储为变量
我有一个名为xyz.file的PDB格式文件,部分内容如下:
ATOM 1 HO5' G5 1 7.415 -9.123 -8.109 1.00 0.00
ATOM 2 O5' G5 1 7.997 -8.960 -8.863 1.00 0.00
ATOM 3 C5' G5 1 9.136 -9.784 -8.729 1.00 0.00
ATOM 4 H5' G5 1 9.679 -9.808 -9.673 1.00 0.00
ATOM 5 H5'' G5 1 8.814 -10.797 -8.484 1.00 0.00
ATOM 6 C4' G5 1 10.067 -9.272 -7.628 1.00 0.00
ATOM 7 H4' G5 1 10.847 -10.015 -7.448 1.00 0.00
ATOM 8 O4' G5 1 10.700 -8.053 -7.990 1.00 0.00
ATOM 9 C1' G5 1 10.866 -7.262 -6.821 1.00 0.00
ATOM 10 H1' G5 1 11.907 -6.970 -6.696 1.00 0.00
ATOM 11 N9 G5 1 10.027 -6.048 -6.896 1.00 0.00
需要找到对应O5'行的ATOM编号(本例中为2),并将该编号存储为变量供后续使用。注意ATOM与目标编号所在列之间的空格数会随编号值变化而改变。
实用解决方法
1. awk(最推荐,处理结构化文本更可靠)
直接用awk按字段匹配,提取目标编号并赋值给变量:
o5_num=$(awk '$3 == "O5\047" {print $2}' xyz.file)
运行完后,变量o5_num就存储了目标编号,可通过echo $o5_num验证结果。
2. grep + cut
如果习惯用grep筛选行,再用cut提取字段:
o5_num=$(grep " O5'" xyz.file | cut -d' ' -f2 --output-delimiter=' ')
grep匹配串前加空格,是为了避免误匹配HO5'这类相似内容。
3. sed
用sed的正则替换提取编号:
o5_num=$(sed -n '/ O5'"'"'/s/^ATOM *\([0-9]*\).*/\1/p' xyz.file)
通过正则匹配ATOM后面的数字,只保留这部分内容输出。
内容的提问来源于stack exchange,提问作者Ethan Aminov

