首页 > 解决方案 > 在保留格式的同时替换列中的值

问题描述

我有一个看起来像这样的文件(.pdb):

ATOM      1  BB  MET A   1       4.171  16.195 -18.221  1.00  0.00           B 
ATOM      2  SC1 MET A   1       0.852  15.586 -20.418  1.00  0.00           S 
ATOM      3  BB  GLU A   3       9.285  12.756 -18.753  1.00 22.00           B 

我想将第 11 列中的值替换为另一个 txt 文件中的值,如下所示:

4.61
4.80
15.81

输出应该是:

ATOM      1  BB  MET A   1       4.171  16.195 -18.221  1.00  4.61           B 
ATOM      2  SC1 MET A   1       0.852  15.586 -20.418  1.00  4.80           S
ATOM      3  BB  GLU A   3       9.285  12.756 -18.753  1.00 15.81           B 

我用 awk 尝试了以下

awk ' NR==FNR{a[NR]=$0; next}{$11=a[FNR]}1' file2.txt fil1.pdb > output.pdb

但不保留格式。我得到了这样的东西:

ATOM 1 BB MET A 1 4.171 16.195 -18.221 1.00 4.61 B
ATOM 2 SC1 MET A 1 0.852 15.586 -20.418 1.00 4.80 S
ATOM 3 SC1 GLU A 3 9.285 12.756 -18.753 1.00 15.81 B

替换时保留格式的任何建议?

标签: unixawkprotein-database

解决方案


这是一个应该适用于非 gnu 版本的 awk:

awk ' NR == FNR {
   a[NR] = $0
   next
}
match($0, /^[[:blank:]]*([^[:blank:]]+[[:blank:]]+){10}/) {
   s = substr($0, RLENGTH+1)
   sub(/[^[:blank:]]+/, "", s)
   print substr($0, 1, RLENGTH) a[FNR] s
}' file2.txt fil1.pdb
ATOM      1  BB  MET A   1       4.171  16.195 -18.221  1.00  4.61           B
ATOM      2  SC1 MET A   1       0.852  15.586 -20.418  1.00  4.80           S
ATOM      3  BB  GLU A   3       9.285  12.756 -18.753  1.00 15.81           B

推荐阅读