定期从文本文件中提取模式之间的文本

定期从文本文件中提取模式之间的文本

我有一个巨大的文本文件(10GB),格式如下(多模型PDB文件):

Model 1
... (some text)
ENDMDL
Model 2
... (some text)
ENDMDL
Model 3
... (some text)
ENDMDL
...
Model 9999
... (some text)
ENDMDL
End

我知道如何将每个模型提取到单独的文件中:

while read line; do
    echo "${line}" >> model_${i}.pdb
    [[ ${line[0]} == ENDMDL ]] && ((i++))
done < $pdb

现在,我需要以离散方式按步骤提取模型N。想法是,如果N=5,则提取模型 1,然后提取模型 6,然后提取模型 11,等等。

Model注意:由于多型号的标准问题,单词后面的数字可能重复,因此不能用作参考局部数据库文件。

答案1

您可以使用awk,使用ENDMDL标记作为记录分隔符并使用模数算法来选择记录:

awk -v skip=5 'BEGIN{ORS = RS = "\nENDMDL\n"} !((NR-1)%skip)' file.pdb

或(将每个提取的模型写入单独的文件)

awk -v skip=5 '
  BEGIN {ORS = RS = "\nENDMDL\n"} 
  !((NR-1)%skip) {f = sprintf("model_%d.pdb", NR); print > f; close(f)}
' file.pdb

答案2

在猛击!

n=5例如更改为n=6提取模型 1,然后提取模型 7,然后提取模型 13,等等。

在终端中打印输出:

#!/bin/bash

i=1
n=5

while read line
        do
                r=$((i % n))
                if [[ "$line" =~ "ENDMDL" ]] && [ "$r" -eq 1 ]
                        then
                        echo "$line"

                        ((i++))
                elif [ "$r" -eq 1 ]
                        then
                        echo "$line"
                elif [[ "$line" =~ "ENDMDL" ]]
                        then
                        ((i++))
                fi
        done < file.pdb

或者直接写入分割文件:

#!/bin/bash

i=1
n=5

while read line
        do
                r=$((i % n))
                if [[ "$line" =~ "ENDMDL" ]] && [ "$r" -eq 1 ]
                        then
                        echo "$line" >> model_"$i".pdb

                        ((i++))
                elif [ "$r" -eq 1 ]
                        then
                        echo "$line" >> model_"$i".pdb
                elif [[ "$line" =~ "ENDMDL" ]]
                        then
                        ((i++))
                fi
        done < file.pdb

相关内容