我有一个看起来像这样的 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
开关就地修改文件。