我有一个包含 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