繁体   English   中英

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

[英]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”不在第一列的开头; 可以使用/\\<CA\\>/
  • 如果有选项卡,请用[[:space]]替换上面的[[:space]]
  • 如果现有的第11列包含六个以上的非空白字符,则以上操作将失败。 如果你事先知道它说的最多八个字符,添加两个额外的点来......在“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”的行中, / CA /
  • 使用\\(.\\{61\\}\\)捕获前61个字符,并将其保留为\\1
  • 并将后16个字符.\\{16\\}替换为1.0000后跟10个空格。
  • -i开关在适当位置修改文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM