如何用Awk或Bash替换第6行起第5列的指定字符串并保留空格
需求与解决方案
需求
将文件中从第6行到末尾的第5列中的大写字母B替换为C,且需完全保留原文件的空格格式。
输入文件内容
ATOM 1939 HG2 PRO A 125 35.681 32.906 38.437 1.00 43.59 H ATOM 1940 HG3 PRO A 125 34.593 33.765 37.652 1.00 41.79 H ATOM 1941 HD2 PRO A 125 37.364 34.075 37.624 1.00 43.38 H ATOM 1942 HD3 PRO A 125 36.333 34.312 36.415 1.00 41.29 H TER ATOM 1944 N MET B 11 16.583 29.975 -4.306 1.00 51.32 N ATOM 1945 CA MET B 11 15.542 30.263 -3.327 1.00 39.92 C ATOM 1946 C MET B 11 16.146 30.366 -1.933 1.00 32.50 C
用户尝试的错误命令
用户尝试了以下awk命令,但存在语法逻辑错误:
awk 'NR == 6 && $ == 5, { sub(" B ", " C ") }'
错误点:
- 条件写法不符合awk语法,无法正确定位第6行及以后的第5列
- 缺少打印行的逻辑,处理后的内容不会输出
- 匹配方式容易误修改其他位置的B,且无法保证只针对第5列操作
正确解决方案
使用以下awk命令可精准修改并保留原空格格式:
awk 'NR>=6 {gsub(/^([^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +)B( +.*)/, "\\1C\\2")} 1' input.txt
命令解释
NR>=6:指定处理第6行及之后的所有行- 正则表达式
^([^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +)B( +.*):捕获前4个字段及后续空格,精准定位第5列的B,再捕获B之后的所有内容 \\1C\\2:将捕获的前半部分内容、替换后的C、后半部分内容拼接,完全保留原空格布局- 最后的
1:打印所有行(包括未修改的前5行)
处理后结果
ATOM 1939 HG2 PRO A 125 35.681 32.906 38.437 1.00 43.59 H ATOM 1940 HG3 PRO A 125 34.593 33.765 37.652 1.00 41.79 H ATOM 1941 HD2 PRO A 125 37.364 34.075 37.624 1.00 43.38 H ATOM 1942 HD3 PRO A 125 36.333 34.312 36.415 1.00 41.29 H TER ATOM 1944 N MET C 11 16.583 29.975 -4.306 1.00 51.32 N ATOM 1945 CA MET C 11 15.542 30.263 -3.327 1.00 39.92 C ATOM 1946 C MET C 11 16.146 30.366 -1.933 1.00 32.50 C
内容的提问来源于stack exchange,提问作者Another.Chemist
相关产品推荐
相关产品推荐

