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