【问题标题】:bash: cat + grep to produce several replicas merging two fillesbash: cat + grep 生成合并两个文件的多个副本
【发布时间】:2022-01-07 14:52:47
【问题描述】:

使用 Linux bash 命令行,我需要在文件 2 的指定部分中合并两个填充,集成文件 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 定义并由 ENDDML 分隔:

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 的某个表达式,以便将 file1 复制到文件 2 的 ENDMDL 之前的位置吗?

【问题讨论】:

    标签: bash grep cat


    【解决方案1】:

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

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

    如果你想传递 shell 变量名,那么使用:

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

    【讨论】:

    • 不应该是awk '...' file2 file1吗?
    • 为什么说这种情况下使用getline不安全?
    • @Fravadona:请read this Q&A
    【解决方案2】:

    使用awk

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

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

    一些替代方案:

    1. /^ENDMDL$/ 替换为$0 == "ENDMDL"
    2. {print} 替换为1。 (如果没有明确的模式,则执行操作。如果没有明确的操作,则打印当前行。)

    【讨论】:

    • 谢谢!只是一个问题,假设我在我的 bash 脚本中运行它以提供 file1 和 file2 作为 shell 变量,我如何在这个脚本中使用 bash 变量。例如,以下带有 'cat ${file1}' 的表达式不起作用: awk '/^ENDMDL$/ {system('cat ${file1}');}; {print}' ${file2}
    • 这可能最终会比 bash 版本慢... awk 既有优点也有缺点...
    • 仅当file1 很大时,您始终可以在BEGIN 块中将file1 读入内存以避免重复重新读取。在bash 中逐行读取比在awk 中慢得多。
    • 内置的read 会逐个字符地读取,直到找到换行符,而不是读取更大的块并搜索换行符。它不缓冲任何东西,以免从标准输入中过度消耗。给定{ read header; cat > no header; } < file 之类的东西,noheader 保证得到除file 第一行之外的所有内容; read 的消耗量不会超过找到第一个换行符所需的量。
    • 好吧,我要找的是: awk -v file1='${full_path}/file1.pdb' '/^ENDMDL$/ {system("cat file1");}; {打印}' SarsCov2_06I_rep1.pdb >> test.pdb。但它不起作用!我需要将 AWK 的 file1 变量与 bash 脚本中定义的路径关联起来
    【解决方案3】:

    这是一个直接的 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 文件中遇到它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      相关资源
      最近更新 更多