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