
以下のようなファイルがあります:
CDS join(36..56,37..67)
CDS 36..183
CDS 457..565
CDS join(505..519,521..596)
CDS join(577..591,725..770)
CDS join(516..591,725..899)
CDS 508..556
CDS 571..841
CDS complement(619..788)
CDS 843..863
ファイル内の特定のヌクレオチド範囲の数を出力したい (シーケンスは別のファイル「sequence.fasta」から読み取られます)。たとえば、sequence.fasta ファイルの場合は次のようになります。
>gi1234 HIVgenome|NC_909999.1
AACTGCGTGTGTGTCCACACAACACTGGGGGACACACAACAACAACACTGGGGGACACACTGGGACAACACTGGGGGACAGGACACTGTACAACACTGGGTGTGTCGGGACAGTACACATGTTGGGGGGGTGTGTCGGACAACACTGGGGGACATGTGTGTACAACACTGGGGGACAGTGACGACGACAACACTGGGGGACACGAGCGTTGTGAGCAGGTGACAACACTGGGGGACAGTGTTTTTACAACACTGGGGGACATTTTTGAGCAGCGACGCAGCGTTGTGGGGTGTGTCGGAAGGTGTGTCGTGTGTCGTGTGTC
出力pは
36 - 56 ACAACAACAACACTGGGGGAC
37 - 67 CAACAACAACACTGGGGGACAACACTGGGAC
& すぐ...
まで
843 - 863 GTGT....
シェルスクリプトを使用してこれを行う最も簡単な方法は何でしょうか?
答え1
この質問には、このフォーラムで提供されるものよりも大きなプログラミング作業が必要です (私はこの種のプログラミングを生業としています)。
のDDBJ/ENA/GenBank ファイル形式(質問の最初のファイル)は複雑で、CDS(ゲノム配列のコード部分)を単純に結合したり、補完したり、組み合わせたりすることができます。さらに、位置座標には修飾子一般的なソリューションでは、これを処理する必要があります。
地元のバイオインフォマティクス専門家(またはプログラマー)に尋ねるか、StackExchangeなどのバイオインフォマティクスフォーラムで尋ねるのが良いでしょう。バイオインフォマティクスサイト彼らは、このようなことを実行するための既存のツールを紹介したり、バイオインフォマティクスに精通した専門家が、たいていはうまく機能するであろう、風変わりな BioPerl/BioPython スクリプトを紹介したりします ;-)
1つ可能ルートはGenBank 特徴抽出ツールただし、小規模なデータセット以外では、オンラインで使用するのはおそらく最適なオプションではありません。
答え2
前回の回答でも述べましたが、Fasta ファイルから特定のサブシーケンスを抽出するというサブ問題を検討しました。解決策は 2 つの部分に分かれています。
sh
コマンドライン解析を実行し、呼び出すシェル スクリプト...awk
fasta ファイルの解析を実行するスクリプト。
これをここに投稿することにしたのは、
- シェル スクリプトでオプションのコマンド ライン解析を行う方法。
- 単なる「ワンライナー」
awk
ではなく、スクリプトを書くことも可能です。awk
前提:
- シーケンス ID は
>
ヘッダー行の の直後に表示され、その後にスペース文字が続きます。 - シーケンスデータ内にはスペースはありません。
スクリプトは と呼ばれますextract.sh
。
gi1234
実行するには、位置 36 から 183 (含む) までのシーケンス ID のシーケンスを取得します。
$ sh extract.sh -i gi1234 -a 36 -b 183 <sequence.fa
ACAACAACAACACTGGGGGACACACTGGGACAACACTGGGGGACA
GGACACTGTACAACACTGGGTGTGTCGGGACAGTACACATGTTGGGGGGGTGTGTCGGACAACACTGGGGGACATGTGTG
TACAACACTGGGGGACAGTGACG
出力はフォーマットされていません。この場合、質問のデータを取得し、スクリプトを実行する前に 80 文字ごとに改行を挿入しました。
シェルスクリプト(extract.sh
):
#!/bin/sh
usage() {
cat <<USAGE_END
Usage:
sh $0 -i seq_id -a start -b end <sequence.fa
USAGE_END
}
while getopts "a:b:i:" opt; do
case $opt in
a) start_pos="$OPTARG" ;;
b) end_pos="$OPTARG" ;;
i) seq_id="$OPTARG" ;;
*) usage; exit 1 ;;
esac
done
if [ "x$seq_id" = "x" ]; then
echo "Missing sequence ID (-i seq_id)"
usage
exit 1
fi
if [ "x$start_pos" = "x" -o "x$end_pos" = "x" ]; then
echo "Missing either start or end coordinates (-a, -b)"
usage
exit 1
fi
if [ ! -f "extract.awk" ]; then
echo "Can not find the extract.awk AWK script!"
exit 1
fi
awk -v id="$seq_id" -v a="$start_pos" -v b="$end_pos" -f extract.awk
スクリプトawk
(extract.awk
):
# state == 0: not yet at wanted sequence entry in file
# state == 1: found sequence entry, not yet at start position
# state == 2: found start position, not yet at end position
# off: offset in sequence read so far
BEGIN { state = 0 }
state == 0 && $0 ~ "^>" id " " {
# We found the sequence entry we're looking for.
state = 1;
off = 0;
next;
}
state > 0 && /^>/ {
# New sequence header found while parsing sequence, terminate.
exit;
}
state == 1 {
len = length($0);
if (len + off < a) {
# Start position is not on this line.
off += len;
next;
}
state = 2;
if (len + off >= b) {
# Whole sequence is found on this line.
print(substr($0, a - off, b - a + 1))
exit;
}
# Output partial start of sequence.
print(substr($0, a - off , len - (a - off) + 1))
off += len;
next;
}
state == 2 {
len = length($0);
if (off > b) {
# (we should not arrive here)
exit;
}
if (len + off < b) {
# End position is not on this line.
print($0);
off += len;
next;
}
# We found the end position, output line until end position
# and terminate.
print(substr($0, 1, b - off));
exit;
}
答え3
私は同様の問題を解決していましたが、回答の 1 つで提供されているスクリプト (WSL、Mac の両方) を使用しようとすると、問題が発生しました...
そこで私は検索を続け、非常に簡単な解決策を見つけました。それはスイートgetfasta
の機能ですbedtools
。
https://bedtools.readthedocs.io/en/latest/content/tools/getfasta.html