将 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 

答案2

command

awk '$1 ~ /seq1/{f=1}$1~/seq2/{f=0;exit}f' sequences.txt  >seq1.txt

sed -n '/seq3/,$p' sequences.txt > seq2.txt

输出

cat seq1.txt
seq1
AAAAA
AAAAA

cat seq2.txt
seq3
TTTTT

相关内容