gpt4 book ai didi

awk - 使用 awk 命令后保留输入文件的格式

转载 作者:行者123 更新时间:2023-12-05 09:26:31 25 4
gpt4 key购买 nike

我有一个 pdb 文件,看起来像这样-

ATOM   1737 HG13 VAL X 121      21.938  -9.234  -0.977  0.00  0.00      SYST  
ATOM 1738 CG2 VAL X 121 21.679 -7.988 1.521 0.00 0.00 SYST
ATOM 1739 HG21 VAL X 121 22.611 -7.674 1.050 0.00 0.00 SYST
ATOM 1740 HG22 VAL X 121 21.340 -7.213 2.207 0.00 0.00 SYST
ATOM 1741 HG23 VAL X 121 21.863 -8.892 2.102 0.00 0.00 SYST
ATOM 1742 C VAL X 121 19.373 -7.193 -1.494 1.00 0.00 SYST
ATOM 1743 O VAL X 121 19.712 -7.180 -2.665 1.00 0.00 SYST
ATOM 1744 OXT VAL X 121 18.180 -7.240 -1.203 0.00 0.00 SYST
ATOM 1745 N CYS X 122 3.096 -0.678 -19.522 0.00 0.00 SYST
ATOM 1746 H1 CYS X 122 2.977 0.322 -19.592 0.00 0.00 SYST
ATOM 1747 H2 CYS X 122 2.198 -1.101 -19.340 0.00 0.00 SYST
ATOM 1748 H3 CYS X 122 3.654 -0.993 -20.303 0.00 0.00 SYST
ATOM 1749 CZ CYS X 122 3.913 -0.961 -18.319 0.00 0.00 SYST
ATOM 1750 HA CYS X 122 3.361 -1.596 -17.626 0.00 0.00 SYST

只要在第 3 个字段中发现“OXT”,我就会尝试将第 5 个字段中的“X”更改为“Y”。我使用 awk 命令编写了以下内容-

awk '$3 == "OXT" {check=!check}check{sub(/X/,"Y",$5)}1' 1vwetest.pdb > 
1vwetestoutput.pdb

然而,这会像这样改变我的输入文件的格式-

ATOM   1737 HG13 VAL X 121      21.938  -9.234  -0.977  0.00  0.00      SYST  
ATOM 1738 CG2 VAL X 121 21.679 -7.988 1.521 0.00 0.00 SYST
ATOM 1739 HG21 VAL X 121 22.611 -7.674 1.050 0.00 0.00 SYST
ATOM 1740 HG22 VAL X 121 21.340 -7.213 2.207 0.00 0.00 SYST
ATOM 1741 HG23 VAL X 121 21.863 -8.892 2.102 0.00 0.00 SYST
ATOM 1742 C VAL X 121 19.373 -7.193 -1.494 1.00 0.00 SYST
ATOM 1743 O VAL X 121 19.712 -7.180 -2.665 1.00 0.00 SYST
ATOM 1744 OXT VAL Y 121 18.180 -7.240 -1.203 0.00 0.00 SYST
ATOM 1745 N CYS Y 122 3.096 -0.678 -19.522 0.00 0.00 SYST
ATOM 1746 H1 CYS Y 122 2.977 0.322 -19.592 0.00 0.00 SYST
ATOM 1747 H2 CYS Y 122 2.198 -1.101 -19.340 0.00 0.00 SYST
ATOM 1748 H3 CYS Y 122 3.654 -0.993 -20.303 0.00 0.00 SYST
ATOM 1749 CZ CYS Y 122 3.913 -0.961 -18.319 0.00 0.00 SYST
ATOM 1750 HA CYS Y 122 3.361 -1.596 -17.626 0.00 0.00 SYST

如何在替换值后保留列宽?还是有其他方法可以做到这一点?

最佳答案

awk 并不关心空格的数量,您也不应该关心。与其尝试精确匹配输入,不如将记录分隔符替换为制表符。例如:

awk '$3 == "OXT" {c=!c} {sub(/X/, c ? "Y" : "X",$5)}1' OFS='\t' input

要注意的是,您需要修改每一行才能进行替换,但这不是什么大问题。

但在您的情况下,将每个单独的字符视为一个字段并通过以下方式保持空白也很容易:

awk '$14$15$16 == "OXT" {c=!c} {sub(/X/, c ? "Y" : "X",$22)}1' FS= OFS= input

如果第 3 列的对齐将 OXT 移出第 14-16 列,这将不起作用,但这可能对您有用。

关于awk - 使用 awk 命令后保留输入文件的格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73881342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com