DNA配列名のリストを含むファイルとDNA配列のリストを含むファイルがあります。それらは次のとおりです。
$ cat list.txt
seq1
seq3
$ cat sequences.txt
>seq1
AAAAA
AAAAA
>seq2
CCCCC
CCCCC
CCCCC
>seq3
TTTTT
私はseq1とseq2(list.txtにリストされています)を検索して単一のファイルにリダイレクトしたいと思います。ご覧のとおり、各シーケンスには行数が異なるため、「sed」が各一致後にN行を選択するとは言えません。私の出力は次のようになりたいです。
$ ls
seq1.txt
seq2.txt
$ cat seq1.txt
>seq1
AAAAA
AAAAA
$ cat seq2.txt
>seq3
TTTTT
私はこれを使用しています:
while read list
do
names=$(echo $list)
sed '/$list/,/>/{/>/q}' "$PWD/sequences.txt" > "$names".dna
done < list.txt
ただし、出力は次のようになります。
$ ls
seq1.txt
seq2.txt
$ cat seq1.txt
>seq1
AAAAA
AAAAA
>seq3
TTTTT
$ cat seq2.txt
>seq1
AAAAA
AAAAA
>seq3
TTTTT
スクリプトは別々のファイルを生成しますが、すべてのファイルには必要な単一ファイルではなく、すべての一致が含まれています。
よろしくお願いします。
ベストアンサー1
これはsedだけでは実行できません。ただし、awkを使用している場合:
awk '
# remember the wanted sequences
NR == FNR {seqs[$1]; next}
$1 ~ /^>/ {
# get the sequence name
seq = $1
sub(/^>/, "", seq)
p = 0
# if it is in the list, set up the file to print to
if (seq in seqs) {
f = seq ".txt"
p = 1
}
}
p {print > f}
' list.txt sequences.txt