bash: cat + grep 生成合并两个文件的多个副本

bash: cat + grep to produce several replicas merging two filles

使用Linux bash命令行,我需要在文件2的指定部分合并两个filles,将文件1的多个副本集成在一起。文件1如下所示:

ATOM      1  N   SER A   1      -2.390   4.343 -17.003  1.00 27.76           N1+
ATOM      2  CA  SER A   1      -2.066   5.647 -16.370  1.00 27.12           C  
ATOM      3  C   SER A   1      -2.394   5.608 -14.874  1.00 26.29           C  
ATOM      4  O   SER A   1      -3.014   4.627 -14.405  1.00 22.93           O  
ATOM      5  CB  SER A   1      -2.771   6.798 -17.057  1.00 28.10           C  
ATOM      6  OG  SER A   1      -2.538   8.023 -16.373  1.00 32.02           O  
ATOM      7  N   GLY A   2      -1.982   6.655 -14.162  1.00 25.31           N  
ATOM      8  CA  GLY A   2      -2.172   6.779 -12.716  1.00 24.93           C  
ATOM      9  C   GLY A   2      -0.888   6.336 -12.067  1.00 23.66           C  
ATOM     10  O   GLY A   2      -0.168   5.459 -12.608  1.00 27.42           O  
ATOM     11  N   PHE A   3      -0.636   6.866 -10.900  1.00 22.07           N  
ATOM     12  CA  PHE A   3       0.622   6.595 -10.191  1.00 21.70           C  
ATOM     13  C   PHE A   3       0.279   6.570  -8.716  1.00 20.39           C  
ATOM     14  O   PHE A   3      -0.265   7.544  -8.167  1.00 23.83           O  

文件 2 是一个多块文件,其中单独的部分由模型 1、模型 2、模型 N 定义并由 ENDMDL 分隔:

MODEL 1
REMARK VINA RESULT:    -7.828      0.000      0.000
REMARK INTER + INTRA:         -13.769
REMARK INTER:                 -10.110
REMARK INTRA:                  -3.659
REMARK UNBOUND:                -3.196
ENDMDL
MODEL 2
REMARK VINA RESULT:    -7.828      0.000      0.000
REMARK INTER + INTRA:         -13.769
REMARK INTER:                 -10.110
REMARK INTRA:                  -3.659
REMARK UNBOUND:                -3.196
ENDMDL
MODEL 3
REMARK VINA RESULT:    -7.828      0.000      0.000
REMARK INTER + INTRA:         -13.769
REMARK INTER:                 -10.110
REMARK INTRA:                  -3.659
REMARK UNBOUND:                -3.196
ENDMDL

我需要将文件 1 的所有内容多次复制到文件 2 中,就在分隔符 ENDMDL 之前(在第二个文件中),从而将文件 1 的多个副本整合到文件 2 中. 这是预期输出的示例:

MODEL 1
REMARK VINA RESULT:    -7.828      0.000      0.000
REMARK INTER + INTRA:         -13.769
REMARK INTER:                 -10.110
REMARK INTRA:                  -3.659
REMARK UNBOUND:                -3.196
ATOM      1  N   SER A   1      -2.390   4.343 -17.003  1.00 27.76           N1+
ATOM      2  CA  SER A   1      -2.066   5.647 -16.370  1.00 27.12           C  
ATOM      3  C   SER A   1      -2.394   5.608 -14.874  1.00 26.29           C  
ATOM      4  O   SER A   1      -3.014   4.627 -14.405  1.00 22.93           O  
ATOM      5  CB  SER A   1      -2.771   6.798 -17.057  1.00 28.10           C  
ATOM      6  OG  SER A   1      -2.538   8.023 -16.373  1.00 32.02           O  
ATOM      7  N   GLY A   2      -1.982   6.655 -14.162  1.00 25.31           N  
ATOM      8  CA  GLY A   2      -2.172   6.779 -12.716  1.00 24.93           C  
ATOM      9  C   GLY A   2      -0.888   6.336 -12.067  1.00 23.66           C  
ATOM     10  O   GLY A   2      -0.168   5.459 -12.608  1.00 27.42           O  
ATOM     11  N   PHE A   3      -0.636   6.866 -10.900  1.00 22.07           N  
ATOM     12  CA  PHE A   3       0.622   6.595 -10.191  1.00 21.70           C  
ATOM     13  C   PHE A   3       0.279   6.570  -8.716  1.00 20.39           C  
ATOM     14  O   PHE A   3      -0.265   7.544  -8.167  1.00 23.83           O 
ENDMDL
MODEL 2
REMARK VINA RESULT:    -7.828      0.000      0.000
REMARK INTER + INTRA:         -13.769
REMARK INTER:                 -10.110
REMARK INTRA:                  -3.659
REMARK UNBOUND:                -3.196
ATOM      1  N   SER A   1      -2.390   4.343 -17.003  1.00 27.76           N1+
ATOM      2  CA  SER A   1      -2.066   5.647 -16.370  1.00 27.12           C  
ATOM      3  C   SER A   1      -2.394   5.608 -14.874  1.00 26.29           C  
ATOM      4  O   SER A   1      -3.014   4.627 -14.405  1.00 22.93           O  
ATOM      5  CB  SER A   1      -2.771   6.798 -17.057  1.00 28.10           C  
ATOM      6  OG  SER A   1      -2.538   8.023 -16.373  1.00 32.02           O  
ATOM      7  N   GLY A   2      -1.982   6.655 -14.162  1.00 25.31           N  
ATOM      8  CA  GLY A   2      -2.172   6.779 -12.716  1.00 24.93           C  
ATOM      9  C   GLY A   2      -0.888   6.336 -12.067  1.00 23.66           C  
ATOM     10  O   GLY A   2      -0.168   5.459 -12.608  1.00 27.42           O  
ATOM     11  N   PHE A   3      -0.636   6.866 -10.900  1.00 22.07           N  
ATOM     12  CA  PHE A   3       0.622   6.595 -10.191  1.00 21.70           C  
ATOM     13  C   PHE A   3       0.279   6.570  -8.716  1.00 20.39           C  
ATOM     14  O   PHE A   3      -0.265   7.544  -8.167  1.00 23.83           O 
ENDMDL
MODEL 3
REMARK VINA RESULT:    -7.828      0.000      0.000
REMARK INTER + INTRA:         -13.769
REMARK INTER:                 -10.110
REMARK INTRA:                  -3.659
REMARK UNBOUND:                -3.196
ATOM      1  N   SER A   1      -2.390   4.343 -17.003  1.00 27.76           N1+
ATOM      2  CA  SER A   1      -2.066   5.647 -16.370  1.00 27.12           C  
ATOM      3  C   SER A   1      -2.394   5.608 -14.874  1.00 26.29           C  
ATOM      4  O   SER A   1      -3.014   4.627 -14.405  1.00 22.93           O  
ATOM      5  CB  SER A   1      -2.771   6.798 -17.057  1.00 28.10           C  
ATOM      6  OG  SER A   1      -2.538   8.023 -16.373  1.00 32.02           O  
ATOM      7  N   GLY A   2      -1.982   6.655 -14.162  1.00 25.31           N  
ATOM      8  CA  GLY A   2      -2.172   6.779 -12.716  1.00 24.93           C  
ATOM      9  C   GLY A   2      -0.888   6.336 -12.067  1.00 23.66           C  
ATOM     10  O   GLY A   2      -0.168   5.459 -12.608  1.00 27.42           O  
ATOM     11  N   PHE A   3      -0.636   6.866 -10.900  1.00 22.07           N  
ATOM     12  CA  PHE A   3       0.622   6.595 -10.191  1.00 21.70           C  
ATOM     13  C   PHE A   3       0.279   6.570  -8.716  1.00 20.39           C  
ATOM     14  O   PHE A   3      -0.265   7.544  -8.167  1.00 23.83           O 
ENDMDL

我曾尝试使用 cat,但它只是将两个文件融合在一起,而无需复制第一个文件:

cat file1.pdb file2.pdb > together.pdb

我需要将其通过管道传递给 grep 的某些表达式,以便将文件 1 复制到文件 2 的 ENDMDL 之前的位置吗?

使用awk.

awk '/^ENDMDL$/ {system("cat file1.pdb");}; {print}' file2.pdb

file2 中的每一行都写入标准输出,但是当该行匹配 ENDMDL 时,file1 的全部内容首先输出。

一些备选方案:

  1. /^ENDMDL$/替换为[=16=] == "ENDMDL"
  2. {print} 替换为 1。 (没有显式模式,执行操作。没有显式操作,打印当前行。)

这是一个直接的 awk 解决方案:

awk '
    BEGIN {
        FS = RS = "\a"
        getline contents < ARGV[2]
        close(ARGV[2])
        ARGV[2] = ""
        RS = "\n"
    }
    /^ENDMDL$/ { printf "%s", contents }
    { print }
' file1 file2

该脚本将文件内容(要插入的内容)放入一个变量中,然后在每次 ENDMDL 出现时打印出来。我将 BELL 字符用作 FSRS,因为您不会在 PDB 文件中遇到它。

这是一个不会调用不安全 systemgetline 的 awk 解决方案:

awk 'NR==FNR {s = s [=10=] ORS; next} [=10=] == "ENDMDL" {[=10=] = s [=10=]} 1' file1 file2

如果你想传递 shell 变量名然后使用:

awk 'NR==FNR {s = s [=11=] ORS; next}
[=11=] == "ENDMDL" {[=11=] = s [=11=]} 1' "$file1" "$file2"