![](/img/trans.png)
[英]How can i create a Linux Script (bash, sed, awk…) to add a line in a specific section of a configuration's file
[英]How can I change a value in a column if that line contains a specific word using sed/awk or bash while keeping the whitespacing?
我有一个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
如果行包含原子CA,我想将第11列更改为1.0000,并将这些更改保存在同一文件中。
如何使用sed,awk或bash做到这一点,以使列之间保持相同的间距? 谢谢
Awk会做的。
awk '$1 == "ATOM" && $3 == "CA" { $11 = 1.0 } { print }' <infile > outfile
Google awk
了解更多信息,因为这是值得学习的基本工具
假定固定宽度的列(如以下注释所示),可以将awk脚本修改为指定FIELDWIDTHS。 需要检查这些值,因为尚不清楚确切的宽度。
awk -v 'FIELDWIDTHS=4 8 6 4 1 6 9 9 9 6 5 12' '
$1 == "ATOM" && $3 == "CA" { $11 = 1.0 }
{ print }
'
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\\>/
。 [[:space]]
替换上面的[[:space]]
。 ......
在“1.0000”后两个空格。 否则,您可以首先通过运行以下命令将第11列减少为单个非空白字符:
X="[^ ]\\+ \\+"; sed "/ CA /{:a;s/\\($X$X$X$X$X$X$X$X$X$X\\)\\([^ ]\\+\\)[^ ] /\\1\\2 /;ta}"
如果您知道第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
行上,这将第11列替换为1.0000
后跟10个空格。
对于某些版本的sed ,您可能需要将\\+
替换为\\{1,\\}
,如下所示:
sed '/ CA /s/[^ ]\{1,\} \{1,\}/1.0000 /11'
另外,如果您知道第11列始终从第62个字符开始并且为16个字符宽,则以下内容也将起作用:
sed -i '/ CA /s/\(.\{61\}\).\{16\}/\11.0000 /' filename
说明:
/ CA /
\\(.\\{61\\}\\)
捕获前61个字符,并将其保留为\\1
.\\{16\\}
替换为1.0000
后跟10个空格。 -i
开关在适当位置修改文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.