根据 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)
我有一个 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)