我有一个包含多行标题的文件(文件 1),以及另一个包含 fasta 格式序列的文件(文件 2)。grep
如果文件 1 中的标题行与文件 2 匹配,我想对序列进行 fasta 处理。
例子:
文件 1:
>sp|B7UM99|TIR_ECO27
>sp|P06616|ERA_ECOLI
文件 2:
>sp|B7UM99|TIR_ECO27
MPIGNLGNNVNGNHLIPPAPPLPSQTDGAA
RGGTGHLISSTGALGSRSLFSPLRNSMADS
VDSRDIPGLPTNPSRLAAATSETCLLGGFE
VLHDKGPLDILNTQIGPSAFRVEVQADGTH
......
>sp|P06616|ERA_ECOLI
MSIDKSYCGFIAIVGRPNVGKSTLLNKLL
GQKISITSRKAQTTRHRIVGIHTEGAYQAIY
VDTPGLHMEEKRAINRLMNKAASSSIGDVE
LVIFVVEGTRWTPDDEMVLNKLREGKAPVI
............
>sp|P0AD68|HUMAN
MKAAAKTQKPKRQEEHANFISWRFALLCGC
ILLALAFLLGRVAWLQVISPDMLVKEGDMR
SLRVQQVSTSRGMITDRSGRPLAVSVPVKA
IWADPKEVHDAGGISVGDRWKALANALNIP
.............
期望输出
>sp|B7UM99|TIR_ECO27
MPIGNLGNNVNGNHLIPPAPPLPSQTDGAA
RGGTGHLISSTGALGSRSLFSPLRNSMADS
VDSRDIPGLPTNPSRLAAATSETCLLGGFE
VLHDKGPLDILNTQIGPSAFRVEVQADGTH
......
>sp|P06616|ERA_ECOLI
MSIDKSYCGFIAIVGRPNVGKSTLLNKLL
GQKISITSRKAQTTRHRIVGIHTEGAYQAIY
VDTPGLHMEEKRAINRLMNKAASSSIGDVE
LVIFVVEGTRWTPDDEMVLNKLREGKAPVI
............
答案1
好的,这是您想要执行的一个稍微复杂的 grep。过去,我用 Perl 编写了程序来执行此操作,但实际上有一个相当简单的 shell 用法可以执行此操作。首先,grep 不能进行多行匹配,因此我们需要一个可以执行此操作的类似 grep 的工具。pcregrep
类似于 grep,但具有多行功能,如建议的那样堆栈溢出。
sudo apt-get install pcregrep
为此,我们必须完成以下步骤。
1) 为 id 文件中的所有特殊字符添加转义符。
sed 's/[^a-zA-Z 0-9]/\\&/g' id_file.txt > search_file.txt
2)接下来,我们将搜索模式的其余部分添加到行尾。
sed -i 's/\>$/\$\[^\>\]\*/' search_file.txt
3) 最后,我们可以使用此搜索文件作为 pcregrep 的输入,并使用 fasta 文件来选择我们想要的序列。
pcregrep -M -f search_file.txt sequences.fasta
正如@DavidForester 所说上一个问题但现在使用 pcregrep 进行多行匹配。
把所有这些放在一起;我们可以把所有事情都做成像这样(稍微复杂一点的)一行代码。
sed 's/[^a-zA-Z 0-9]/\\&/g' id_file.txt | sed 's/\>$/\$\[^\>\]\*/'| pcregrep -M -f /dev/stdin sequences.fasta
这样做的好处是不需要额外的文件。
简而言之,我们将输出通过管道传输到命令之间以获取正确的搜索字符串,然后pcregrep
使用-f /dev/stdin
标志将其传输到管道。我的测试表明,这会产生您请求的准确输出。我希望两年前我需要它时能够想出这个!
答案2
您可以通过循环内的简单 awk 命令来完成此操作:
$ while IFS= read -r tag; do
# Execute the awk command with the current tag
awk -v t="$tag" '/^>/{f=(t==$0)} f' fasta-1141936
done < fasta-tags
>sp|B7UM99|TIR_ECO27
MPIGNLGNNVNGNHLIPPAPPLPSQTDGAA
RGGTGHLISSTGALGSRSLFSPLRNSMADS
VDSRDIPGLPTNPSRLAAATSETCLLGGFE
VLHDKGPLDILNTQIGPSAFRVEVQADGTH
>sp|P06616|ERA_ECOLI
MSIDKSYCGFIAIVGRPNVGKSTLLNKLL
GQKISITSRKAQTTRHRIVGIHTEGAYQAIY
VDTPGLHMEEKRAINRLMNKAASSSIGDVE
LVIFVVEGTRWTPDDEMVLNKLREGKAPVI
在哪里:
$ cat fasta-1141936
>sp|B7UM99|TIR_ECO27
MPIGNLGNNVNGNHLIPPAPPLPSQTDGAA
RGGTGHLISSTGALGSRSLFSPLRNSMADS
VDSRDIPGLPTNPSRLAAATSETCLLGGFE
VLHDKGPLDILNTQIGPSAFRVEVQADGTH
>sp|P06616|ERA_ECOLI
MSIDKSYCGFIAIVGRPNVGKSTLLNKLL
GQKISITSRKAQTTRHRIVGIHTEGAYQAIY
VDTPGLHMEEKRAINRLMNKAASSSIGDVE
LVIFVVEGTRWTPDDEMVLNKLREGKAPVI
>sp|P0AD68|HUMAN
MKAAAKTQKPKRQEEHANFISWRFALLCGC
ILLALAFLLGRVAWLQVISPDMLVKEGDMR
SLRVQQVSTSRGMITDRSGRPLAVSVPVKA
IWADPKEVHDAGGISVGDRWKALANALNIP
和
$ cat fasta-tags
>sp|B7UM99|TIR_ECO27
>sp|P06616|ERA_ECOLI