sed 一致を単一ファイルにリダイレクト

sed 一致を単一ファイルにリダイレクト

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 

おすすめ記事