我有一个巨大的文本文件(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