如果列中的值包含使用 sed/awk 或 bash 的特定单词,同时保持白色间距,如何更改该列中的值?



我有一个看起来像这样的 pdb:

ATOM      1  P     A 2   1     224.160 179.728 151.662  1.00 40.00           P  
ATOM      2  OP1   A 2   1     225.507 179.132 151.738  1.00 40.00           O  
ATOM      3  CA    A 2   1     223.640 180.497 152.816  1.00 40.00           O  
ATOM      4  O5'   A 2   1     224.374 180.738 150.465  1.00 40.00           O 

如果一行包含atom CA,我想将第11列更改为1.0000,并将这些更改保存在同一个文件中。

如何使用 sed、awk 或 bash 来做到这一点,以便我在列之间保持相同的间距? 谢谢

sed -E '/ CA /s/[^ ]+/1.000/11' file

(GNU sed,假设空格而不是制表符(

这使用替换后的11来替换第 11 个单词。 更换仅在与/ CA /匹配的线路上进行

+需要-E才能按预期工作。

您可能希望根据您的确切要求定制空格或替换字符串。 由于它只影响第 11 列,因此您可以做任何您想做的事情。

以下sed命令将起作用:

sed '/ CA /s/([^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +)....../11.0000/'

或:

sed -E '/ CA /s/([^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +)....../11.0000/'

或(带 bash(:

X="[^ ]+ +"; sed -E "/ CA /s/($X$X$X$X$X$X$X$X$X$X)....../11.0000/"

或:

X="[^ ]+ +"; sed "/ CA /s/($X$X$X$X$X$X$X$X$X$X)....../11.0000/"

给:

ATOM      1  P     A 2   1     224.160 179.728 151.662  1.00 40.00           P  
ATOM      2  OP1   A 2   1     225.507 179.132 151.738  1.00 40.00           O  
ATOM      3  CA    A 2   1     223.640 180.497 152.816  1.00 1.0000          O  
ATOM      4  O5'   A 2   1     224.374 180.738 150.465  1.00 40.00           O

解释:

  • / CA /如果一行包含标记"CA",则
  • s/($X$X$X$X$X$X$X$X$X$X)....../将第 11 列的前十列和前六个字符替换为
  • 11.0000/十列中已有的内容,并在第 11 列中按"1.0000"列出。

改进:

  • 这假设"CA"不在第一列的开头;这可以使用/<CA>/修复。
  • 如果有制表符,请将上面的空格替换为[[:space]]
  • 如果现有第 11 列具有六个以上的非空字符,则上述操作将失败。如果您事先知道它最多有八个字符,请在......中添加两个额外的点,并在"1.0000"之后添加两个空格。
  • 否则,您可以先通过运行以下命令将第 11 列减少为单个非空白字符:

    X="[^ ]+ +"; sed "/ CA /{:a;s/($X$X$X$X$X$X$X$X$X$X)([^ ]+)[^ ] /12  /;ta}"
    

Awk将完成这项工作。

awk '$1  == "ATOM" && $3 == "CA" { $11 = 1.0 } { print }' <infile > outfile

谷歌awk了解更多信息,因为这是一个值得学习的基本工具

假设列的宽度固定,如下面的注释所示,可以修改 awk 脚本以指定字段宽度。需要检查这些值,因为问题不清楚确切的宽度。

awk -v 'FIELDWIDTHS=4 8 6 4 1 6 9 9 9 6 5 12' '
$1  == "ATOM" && $3 == "CA" { $11 = 1.0 }
{ print }
'

如果您知道第 11 列始终为 16 个字符宽,则执行以下sed命令:

sed '/ CA /s/[^ ]+ +/1.0000          /11'

将给予:

ATOM      1  P     A 2   1     224.160 179.728 151.662  1.00 40.00           P  
ATOM      2  OP1   A 2   1     225.507 179.132 151.738  1.00 40.00           O  
ATOM      3  CA    A 2   1     223.640 180.497 152.816  1.00 1.0000          O  
ATOM      4  O5'   A 2   1     224.374 180.738 150.465  1.00 40.00           O

说明:在带有标记CA的行上,这将用1.0000后跟 10 个空格替换第 11 列。

对于某些版本的sed,您可能需要将+替换为{1,},如下所示:

sed '/ CA /s/[^ ]{1,} {1,}/1.0000          /11'

或者,如果您知道第 11 列始终从第 62 个字符开始,宽度为 16 个字符,则以下内容也可以使用:

sed -i '/ CA /s/(.{61}).{16}/11.0000          /' filename

解释:

  • 在带有令牌"CA"的行上,/ CA /
  • (.{61})捕获前 61 个字符,并保留它们1
  • 并将接下来的 16 个字符.{16}替换为1.0000后跟 10 个空格。
  • -i开关就地修改文件。

最新更新