问题描述
我是 awk 新手,如果第 1 列包含 HETATM 一词,我正在尝试修改第 3 列(用关于 NR 的编号)。
我的输入文件是:
HETATM 25 O UNL 1 86.047 83.059 103.165 1.00 0.00 O
HETATM 26 N UNL 1 87.071 82.457 102.433 1.00 0.00 N
HETATM 27 C UNL 1 91.764 77.729 97.523 1.00 0.00 C
HETATM 28 O UNL 1 92.740 78.174 98.137 1.00 0.00 O
HETATM 29 H UNL 1 90.477 80.552 97.677 1.00 0.00 H
CONECT 1 2
CONECT 2 1 3
CONECT 3 2 4 7
我想要的输出是:
HETATM 25 O25 UNL 1 86.047 83.059 103.165 1.00 0.00 O
HETATM 26 N26 UNL 1 87.071 82.457 102.433 1.00 0.00 N
HETATM 27 C27 UNL 1 91.764 77.729 97.523 1.00 0.00 C
HETATM 28 O28 UNL 1 92.740 78.174 98.137 1.00 0.00 O
HETATM 29 H29 UNL 1 90.477 80.552 97.677 1.00 0.00 H
CONECT 1 2
CONECT 2 1 3
CONECT 3 2 4 7
我正在使用此命令来维护文件的格式,但我不能。你能帮我吗?
awk 'BEGIN{FS=OFS="\t";}{if($1=="HETATM"){$3=$3NR};print $0}' file.pdb
非常感谢。
解决方法
使用任何 sed:
$ sed 's/^HETATM *\([^ ]*\) *[^ ]*/&\1/' file
HETATM 25 O25 UNL 1 86.047 83.059 103.165 1.00 0.00 O
HETATM 26 N26 UNL 1 87.071 82.457 102.433 1.00 0.00 N
HETATM 27 C27 UNL 1 91.764 77.729 97.523 1.00 0.00 C
HETATM 28 O28 UNL 1 92.740 78.174 98.137 1.00 0.00 O
HETATM 29 H29 UNL 1 90.477 80.552 97.677 1.00 0.00 H
CONECT 1 2
CONECT 2 1 3
CONECT 3 2 4 7
原答案:
假设您的输入确实如您在脚本中所指示的那样以制表符分隔,那么您非常非常接近:
$ awk 'BEGIN{FS=OFS="\t"} $1=="HETATM"{$3=$3 $2} 1' file
HETATM 25 O25 UNL 1 86.047 83.059 103.165 1.00 0.00 O
HETATM 26 N26 UNL 1 87.071 82.457 102.433 1.00 0.00 N
HETATM 27 C27 UNL 1 91.764 77.729 97.523 1.00 0.00 C
HETATM 28 O28 UNL 1 92.740 78.174 98.137 1.00 0.00 O
HETATM 29 H29 UNL 1 90.477 80.552 97.677 1.00 0.00 H
CONECT 1 2
CONECT 2 1 3
CONECT 3 2 4 7