awk gsub 搞乱格式
awk gsub messing up format
我正在尝试使用 bash 脚本替换 pdb 中满足特定条件的 2 列,其中 运行 包含一个 awk 文件(bash 脚本具有另一个目的,awk文件是为了代码分离)。当我 运行 没有设置 OFS 的脚本时,带有字符串替换的行没有足够的间距。当我设置 OFS="\t"
时,间距太大(相对于未更改的行)。为什么只执行一个字符串操作就改变了整行的格式?
这里是myScript.sh
(some unrelated grep stuff)
awk -f ./myAwkScript.awk 4HKD.pdb.bk > 4HKD.pdb.bk.gen
这里是myAwkScript.awk
#!/usr/bin/awk
BEGIN { OFS="\t" }
{ if( =="HETATM" && =="MSE" ) {
gsub( /MSE/, "MET", );
gsub( /HETATM/, "ATOM", );
}
print;
}
这是输出的样子,因此您可以看到它对制表符的作用
ATOM 127 OE1 GLN A 449 -4.056 11.297 119.695 1.00 20.83 O
ATOM 128 NE2 GLN A 449 -1.948 10.876 120.359 1.00 14.98 N
ATOM 129 N MET A 450 -4.523 16.830 119.280 1.00 14.88 N
ATOM 130 CA MET A 450 -5.537 17.804 118.911 1.00 15.65 C
ATOM 137 N ARG A 451 -3.902 19.530 119.337 1.00 15.80 N
ATOM 138 CA ARG A 451 -3.228 20.800 119.118 1.00 15.54 C
ATOM 139 C ARG A 451 -2.430 20.827 117.826 1.00 16.64 C C
这是不改变 OFS 的样子
ATOM 127 OE1 GLN A 449 -4.056 11.297 119.695 1.00 20.83 O
ATOM 128 NE2 GLN A 449 -1.948 10.876 120.359 1.00 14.98 N
ATOM 129 N MET A 450 -4.523 16.830 119.280 1.00 14.88 N
ATOM 130 CA MET A 450 -5.537 17.804 118.911 1.00 15.65 C
ATOM 135 SE MET A 450 -8.866 19.181 121.271 1.00 55.26 SE
ATOM 136 CE MET A 450 -7.749 20.188 122.510 1.00 28.83 C
ATOM 137 N ARG A 451 -3.902 19.530 119.337 1.00 15.80 N
ATOM 138 CA ARG A 451 -3.228 20.800 119.118 1.00 15.54 C
ATOM 139 C ARG A 451 -2.430 20.827 117.826 1.00 16.64 C
保留未修改的行距。如果你在 print 语句之前添加 =
就可以了。此外,由于您正在寻找完全匹配,因此不需要 gsub。顺便说一下,您可以将脚本重写为
BEGIN {
OFS="\t"
}
=="HETATM" && =="MSE" {
="ATOM"
="MET"
}
{=}
1
我正在尝试使用 bash 脚本替换 pdb 中满足特定条件的 2 列,其中 运行 包含一个 awk 文件(bash 脚本具有另一个目的,awk文件是为了代码分离)。当我 运行 没有设置 OFS 的脚本时,带有字符串替换的行没有足够的间距。当我设置 OFS="\t"
时,间距太大(相对于未更改的行)。为什么只执行一个字符串操作就改变了整行的格式?
这里是myScript.sh
(some unrelated grep stuff)
awk -f ./myAwkScript.awk 4HKD.pdb.bk > 4HKD.pdb.bk.gen
这里是myAwkScript.awk
#!/usr/bin/awk
BEGIN { OFS="\t" }
{ if( =="HETATM" && =="MSE" ) {
gsub( /MSE/, "MET", );
gsub( /HETATM/, "ATOM", );
}
print;
}
这是输出的样子,因此您可以看到它对制表符的作用
ATOM 127 OE1 GLN A 449 -4.056 11.297 119.695 1.00 20.83 O
ATOM 128 NE2 GLN A 449 -1.948 10.876 120.359 1.00 14.98 N
ATOM 129 N MET A 450 -4.523 16.830 119.280 1.00 14.88 N
ATOM 130 CA MET A 450 -5.537 17.804 118.911 1.00 15.65 C
ATOM 137 N ARG A 451 -3.902 19.530 119.337 1.00 15.80 N
ATOM 138 CA ARG A 451 -3.228 20.800 119.118 1.00 15.54 C
ATOM 139 C ARG A 451 -2.430 20.827 117.826 1.00 16.64 C C
这是不改变 OFS 的样子
ATOM 127 OE1 GLN A 449 -4.056 11.297 119.695 1.00 20.83 O
ATOM 128 NE2 GLN A 449 -1.948 10.876 120.359 1.00 14.98 N
ATOM 129 N MET A 450 -4.523 16.830 119.280 1.00 14.88 N
ATOM 130 CA MET A 450 -5.537 17.804 118.911 1.00 15.65 C
ATOM 135 SE MET A 450 -8.866 19.181 121.271 1.00 55.26 SE
ATOM 136 CE MET A 450 -7.749 20.188 122.510 1.00 28.83 C
ATOM 137 N ARG A 451 -3.902 19.530 119.337 1.00 15.80 N
ATOM 138 CA ARG A 451 -3.228 20.800 119.118 1.00 15.54 C
ATOM 139 C ARG A 451 -2.430 20.827 117.826 1.00 16.64 C
保留未修改的行距。如果你在 print 语句之前添加 =
就可以了。此外,由于您正在寻找完全匹配,因此不需要 gsub。顺便说一下,您可以将脚本重写为
BEGIN {
OFS="\t"
}
=="HETATM" && =="MSE" {
="ATOM"
="MET"
}
{=}
1