根据 table 的定义,多次从 multifasta 文件中复制特定序列

Copy specific sequences from a multifasta file a number of times as defined by a table

我有一个 multi fasta 文件,如下所示:

>sequence_1
MTAGAAAPSATGSDAAAELSELYR
>sequence_2
SAPDEPVAVVGLACRLPGAADPEAFWALL
...

我有第二个文件,旁边有序列名称和数字,如下所示:

sequence_1 3
sequence_2 5
...

我想按照第二个文件中第二列的定义多次复制 fasta 文件中的序列,以获得以下输出:

>sequence_1
MTAGAAAPSATGSDAAAELSELYR
>sequence_1
MTAGAAAPSATGSDAAAELSELYR
>sequence_1
MTAGAAAPSATGSDAAAELSELYR
>sequence_2
SAPDEPVAVVGLACRLPGAADPEAFWALL
>sequence_2
SAPDEPVAVVGLACRLPGAADPEAFWALL
>sequence_2
SAPDEPVAVVGLACRLPGAADPEAFWALL
>sequence_2
SAPDEPVAVVGLACRLPGAADPEAFWALL
>sequence_2
SAPDEPVAVVGLACRLPGAADPEAFWALL
...

有人用 grep 或 AWK(或任何其他 unix 命令)解决这个问题吗?非常感谢您的帮助

一个非常丑陋但有效的解决方案:

awk -F' ' '{ for(i=1; i<;i++) print }' names.txt | awk '{print }' | xargs -n 1 -I '{}' grep -A 1 {} seq.fasta
  • 第一个awk语句将文件拆分成名称并重复打印多次
  • 第二个 awk 语句打印每一行(grep 忽略相同的模式,grep 的这个特定 "feature" 的解决方法)
  • 接下来我们使用xargs将行传递给grep

输出:

>sequence_1
MTAGAAAPSATGSDAAAELSELYR
>sequence_1
MTAGAAAPSATGSDAAAELSELYR
>sequence_2
SAPDEPVAVVGLACRLPGAADPEAFWALL
>sequence_2
SAPDEPVAVVGLACRLPGAADPEAFWALL
>sequence_2
SAPDEPVAVVGLACRLPGAADPEAFWALL
>sequence_2
SAPDEPVAVVGLACRLPGAADPEAFWALL

对于大文件,多次调用 grep 而不是重复输出肯定不是最高效的解决方案。

如果你的序列总是只有一行:

$ cat sequence.fasta 
sequence_1 3
sequence_2 5

$ cat file.fasta 
>sequence_1
MTAGAAAPSATGSDAAAELSELYR
>sequence_2
SAPDEPVAVVGLACRLPGAADPEAFWALL

$ awk 'NR==FNR{s[">"]=;next}
        in s{getline fasta
             for (i=1;i<=s[];i++){
               print 
               print fasta
               }
     }' sequence.fasta file.fasta

结果

>sequence_1
MTAGAAAPSATGSDAAAELSELYR
>sequence_1
MTAGAAAPSATGSDAAAELSELYR
>sequence_1
MTAGAAAPSATGSDAAAELSELYR
>sequence_2
SAPDEPVAVVGLACRLPGAADPEAFWALL
>sequence_2
SAPDEPVAVVGLACRLPGAADPEAFWALL
>sequence_2
SAPDEPVAVVGLACRLPGAADPEAFWALL
>sequence_2
SAPDEPVAVVGLACRLPGAADPEAFWALL
>sequence_2
SAPDEPVAVVGLACRLPGAADPEAFWALL

非常感谢!我还找到了一种方法(实际上非​​常简单)用 R 来做。我把它贴在这里以防有人感兴趣: 首先,您必须使用 Biostrings 包中的 readAAStringSet 函数将 fasta 文件读入 R,并使用 read.delim 函数将 table 文件读入 R。然后使用函数 rep 来完成这项工作:

    fastafile <- readAAStringSet("file.fasta")
    secondfile <- read.delim("second.file", header=F, sep=" ")
    multiply <- rep(fastafile, secondfile$V2)