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

时间:2016-11-07 11:06:58

标签: awk grep fasta

我有一个看起来像这样的多个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命令)的解决方案?非常感谢您的帮助

3 个答案:

答案 0 :(得分:0)

一个真正丑陋但有效的解决方案:

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

输出:

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

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

答案 1 :(得分:0)

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

$ cat sequence.fasta 
sequence_1 3
sequence_2 5

$ cat file.fasta 
>sequence_1
MTAGAAAPSATGSDAAAELSELYR
>sequence_2
SAPDEPVAVVGLACRLPGAADPEAFWALL

$ awk 'NR==FNR{s[">"$1]=$2;next}
       $1 in s{getline fasta
             for (i=1;i<=s[$1];i++){
               print $1
               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

答案 2 :(得分:0)

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

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