fastaファイルからランダムな200文字のサブストリングを抽出する方法

fastaファイルからランダムな200文字のサブストリングを抽出する方法

ファイルからシーケンスを抽出するために使用できるLinuxコマンドはありますか?たとえば、ファイルには百万行が含まれており、ファイル内のヘッダーに関係なく、200文字の文字列のみをランダムにサンプリングしたいとします。

ランダムとは、200個のシーケンスごとに選択される確率が同じで、選択された部分文字列のいずれも繰り返されないことを意味します。

次のように、fastaファイルから200文字のランダムシーケンス(ヘッダーを考慮しない)を抽出しようとしています。

>NC_001416.1 Enterobacteria phage lambda, complete genome
GGGCGGCGACCTCGCGGGTTTTCGCTATTTATGAAAATTTTCCGGTTTAAGGCGTTTCCGTTCTTCTTCG
TCATAACTTAATGTTTTTATTTAAAATACCCTCTGAAAAGAAAGGAAACGACAGGTGCTGAAAGCGAGGC
TTTTTGGCCTCTGTCGTTTCCTTTCTCTGTTTTTGTCCGTGGAATGAACAATGGAAGTCAACAAAAAGCA
GCTGGCTGACATTTTCGGTGCGAGTATCCGTACCATTCAGAACTGGCAGGAACAGGGAATGCCCGTTCTG
CGAGGCGGTGGCAAGGGTAATGAGGTGCTTTATGACTCTGCCGCCGTCATAAAATGGTATGCCGAAAGGG
ATGCTGAAATTGAGAACGAAAAGCTGCGCCGGGAGGTTGAAGAACTGCGGCAGGCCAGCGAGGCAGATCT
CCAGCCAGGAACTATTGAGTACGAACGCCATCGACTTACGCGTGCGCAGGCCGACGCACAGGAACTGAAG
AATGCCAGAGACTCCGCTGAAGTGGTGGAAACCGCATTCTGTACTTTCGTGCTGTCGCGGATCGCAGGTG
AAATTGCCAGTATTCTCGACGGGCTCCCCCTGTCGGTGCAGCGGCGTTTTCCGGAACTGGAAAACCGACA
TGTTGATTTCCTGAAACGGGATATCATCAAAGCCATGAACAAAGCAGCCGCGCTGGATGAACTGATACCG
GGGTTGCTGAGTGAATATATCGAACAGTCAGGTTAACAGGCTGCGGCATTTTGTCCGCGCCGGGCTTCGC
TCACTGTTCAGGCCGGAGCCACAGACCGCCGTTGAATGGGCGGATGCTAATTACTATCTCCCGAAAGAAT
CCGCATACCAGGAAGGGCGCTGGGAAACACTGCCCTTTCAGCGGGCCATCATGAATGCGATGGGCAGCGA
CTACATCCGTGAGGTGAATGTGGTGAAGTCTGCCCGTGTCGGTTATTCCAAAATGCTGCTGGGTGTTTAT
GCCTACTTTATAGAGCATAAGCAGCGCAACACCCTTATCTGGTTGCCGACGGATGGTGATGCCGAGAACT
TTATGAAAACCCACGTTGAGCCGACTATTCGTGATATTCCGTCGCTGCTGGCGCTGGCCCCGTGGTATGG
CAAAAAGCACCGGGATAACACGCTCACCATGAAGCGTTTCACTAATGGGCGTGGCTTCTGGTGCCTGGGC
GGTAAAGCGGCAAAAAACTACCGTGAAAAGTCGGTGGATGTGGCGGGTTATGATGAACTTGCTGCTTTTG
ATGATGATATTGAACAGGAAGGCTCTCCGACGTTCCTGGGTGACAAGCGTATTGAAGGCTCGGTCTGGCC
AAAGTCCATCCGTGGCTCCACGCCAAAAGTGAGAGGCACCTGTCAGATTGAGCGTGCAGCCAGTGAATCC
CCGCATTTTATGCGTTTTCATGTTGCCTGCCCGCATTGCGGGGAGGAGCAGTATCTTAAATTTGGCGACA
AAGAGACGCCGTTTGGCCTCAAATGGACGCCGGATGACCCCTCCAGCGTGTTTTATCTCTGCGAGCATAA
TGCCTGCGTCATCCGCCAGCAGGAGCTGGACTTTACTGATGCCCGTTATATCTGCGAAAAGACCGGGATC

たとえば、次のシーケンスのサブセットを取得できます。

GCATACCAGGAAGGGCGCTGGGAAACACTGCCCTTTCAGCGGGCCATCATGAATGCGATGGGCAGCGACTACATCCGTGAGGTGAATGTGGTGAAGTCTGCCCGTGTCGGTTATTCCAAAATGCTGCTGGGTGTTTATGCCTACTTTATAGAGCATAAGCAGCGCAACACCCTTATCTGGTTGCCGACGGATGGTGATGC

ベストアンサー1

任意の200文字の長さのシーケンスを複数素早く選択するには、改行(またはヘッダー)なしでfastaファイルのコピーを保存するのが便利です。

< file.fasta tail -n+2 | tr -d '\n' > newfile

したがって、改行文字を押すか、それを処理するための計算を実行せずに開始文字をランダムに選択します。また、wc -c < file(またはwc -m)を想定してstat -c "%s" file同じ結果を提供するので(通常のコンテンツ、ロケールなどの場合は最初に確認)、statより速く返す方法を使用します。

文字を含むファイルの場合、n使用可能なオプションは、n-200200文字の長い文字列を形成できないため、可能な開始位置から最後の200文字を除外することです。

shuf任意の数値範囲を選択してからの1,n-200組み合わせを選択すると、文字列が抽出されます。headtail-c

n=$(stat -c "%s" newfile)
r=$(shuf -i1-"$((n-200+1))" -n1)
< newfile tail -c+"$r" | head -c200

複数回呼び出すと、さまざまな結果が得られます。独立ランダムに選択します。これは、同一または重複するシーケンスを意味します。

ファイルの同じ場所にないか重複しないなど、異なる基準に従うことを選択するには、同じコマンドでshuf乱数(より高い値)を解析する必要があります。-nまたは、重複を避けるために、既存の値から200に近い新しい値を削除してください。

xをランダムに選択したい場合独立ただし、一意のランダム行シーケンスの作成を開始し、重複項目を削除してからx個を保持することで、headたとえば10個を取得できます。

while true; do sh test.sh; printf "\n"; done | awk '!seen[$0]++' | head

おすすめ記事