用awk替换列,保留格式

use*_*147 0 format awk replace

我有一个a.pdb文件,

ATOM      1  N   ARG     1       0.000   0.000   0.000  1.00  0.00           N
ATOM      2  H1  ARG     1       0.000   0.000   0.000  1.00  0.00           H
ATOM      3  H2  ARG     1       0.000   0.000   0.000  1.00  0.00           H
ATOM      4  H3  ARG     1       0.000   0.000   0.000  1.00  0.00           H
Run Code Online (Sandbox Code Playgroud)

a.xyz文件一样

16.388 -5.760 -23.332
17.226 -5.608 -23.768
15.760 -5.238 -23.831
17.921 -5.926 -26.697
Run Code Online (Sandbox Code Playgroud)

我想用a.xyz替换a.pdb的6,7和8列.一旦被替换,我需要维护a.pdb的标签/空格/列.

我试过了

awk 'NR==FNR {fld1[NR]=$1; fld2[NR]=$2; fld3[NR]=$3; next} {$6=fld1[FNR]; $7=fld2[FNR]; $8=fld3[FNR]}1' a.xyz a.pdb 
Run Code Online (Sandbox Code Playgroud)

但它没有保留格式.

Ed *_*ton 9

这正是为什么GNU awk中的split()的第4个arg被发明以促进:

gawk '
NR==FNR { pdb[NR]=$0; next }
{
    split(pdb[FNR],flds,FS,seps)
    flds[6]=$1
    flds[7]=$2
    flds[8]=$3
    for (i=1;i in flds;i++)
        printf "%s%s", flds[i], seps[i]
    print ""
}
' a.pdb a.xyz

ATOM      1  N   ARG     1       16.388   -5.760   -23.332  1.00  0.00           N
ATOM      2  H1  ARG     1       17.226   -5.608   -23.768  1.00  0.00           H
ATOM      3  H2  ARG     1       15.760   -5.238   -23.831  1.00  0.00           H
ATOM      4  H3  ARG     1       17.921   -5.926   -26.697  1.00  0.00           H
Run Code Online (Sandbox Code Playgroud)

  • 好的,我知道了!感谢您的解释.+1正式给出!顺便说一句,我们在每个人的桌子上都非常需要一个"awk"食谱!*眨眼眨眼* (2认同)