Awk 替换特定列中的值,同时保持原始格式不变

Awk 替换特定列中的值,同时保持原始格式不变,awk,gawk,Awk,Gawk,我的输入文件具有以下格式: ATOM 1 Cal Cal 1 61.270 93.780 100.040 1.00 0.00 ATOM 2 Cal Cal 2 12.080 65.560 105.560 1.00 0.00 ATOM 13 Cal Cal 13 40.800 13.530 75.100 1.00 0.00 ATOM 200 Cal Cal 200

我的输入文件具有以下格式:

 ATOM      1 Cal  Cal     1      61.270  93.780 100.040  1.00  0.00
 ATOM      2 Cal  Cal     2      12.080  65.560 105.560  1.00  0.00
 ATOM     13 Cal  Cal    13      40.800  13.530  75.100  1.00  0.00
 ATOM    200 Cal  Cal   200     102.620  22.520  97.600  1.00  0.00
我想用值“32.450”替换第8个cloumn中的所有值,同时保持原始格式(间距)不变。i、 e,预期输出应如下所示

 ATOM      1 Cal  Cal     1      61.270  93.780  32.450  1.00  0.00
 ATOM      2 Cal  Cal     2      12.080  65.560  32.450  1.00  0.00
 ATOM     13 Cal  Cal    13      40.800  13.530  32.450  1.00  0.00
 ATOM    200 Cal  Cal   200     102.620  22.520  32.450  1.00  0.00
我尝试过使用简单的awk命令

awk -F " " '{ 
   print $1" " $2" "$3" "$4" "$5" "$6" "$7" "'32.450'" "$9" "$10" 
}' input.pdb > output.pdb
但是,它未能保留原始格式


有谁能帮我找到更好的方法来实现这一点,最好是使用awk或gawk?

如果您的示例输入中始终有固定宽度的列:

$ awk '{ print substr($0,1,47) " 32.450" substr($0,55) }' f.txt
ATOM      1 Cal  Cal     1      61.270  93.780  32.450  1.00  0.00
ATOM      2 Cal  Cal     2      12.080  65.560  32.450  1.00  0.00
ATOM     13 Cal  Cal    13      40.800  13.530  32.450  1.00  0.00
ATOM    200 Cal  Cal   200     102.620  22.520  32.450  1.00  0.00

只需告诉
sed
捕捉前7个块,跳过第8个块,然后将7个块打印回
32.450

$  sed -r 's/(( +[^ ]+){7}) +[^ ]+/\1  32.450/' file
ATOM      1 Cal  Cal     1      61.270  93.780  32.450  1.00  0.00
ATOM      2 Cal  Cal     2      12.080  65.560  32.450  1.00  0.00
ATOM     13 Cal  Cal    13      40.800  13.530  32.450  1.00  0.00
ATOM    200 Cal  Cal   200     102.620  22.520  32.450  1.00  0.00
GNU awk:

gawk '
    BEGIN {FIELDWIDTHS="5 7 4 5 6 12 8 8 6 6"; OFS=""}
    {$8="  32.450"; print}
' file
输入

输出

 ATOM      1 Cal  Cal     1      61.270  93.780  32.450  1.00  0.00
 ATOM      2 Cal  Cal     2      12.080  65.560  32.450  1.00  0.00
 ATOM     13 Cal  Cal    13      40.800  13.530  32.450  1.00  0.00
 ATOM    200 Cal  Cal   200     102.620  22.520  32.450  1.00  0.00

您的预期输出确实更改了输入中的空格。例如,在输入中,第一行:
93.780 100.040
两个字段之间有一个空格,但在输出中,有两个空格:
93.780 32.450
请解释对齐规则。文件采用pdb格式。这里,不是计算每个列之间的空白,而是为每个漂亮的使用<代码>字段宽度的值分配一组特定的空间!为了加强字段宽度,这可能更好:
$8=sprintf“%8.3f”,32.45
 ATOM      1 Cal  Cal     1      61.270  93.780  32.450  1.00  0.00
 ATOM      2 Cal  Cal     2      12.080  65.560  32.450  1.00  0.00
 ATOM     13 Cal  Cal    13      40.800  13.530  32.450  1.00  0.00
 ATOM    200 Cal  Cal   200     102.620  22.520  32.450  1.00  0.00