我是一名分子生物学家,最近刚刚开始使用 bash,并尝试编写几个脚本来自动执行一些我通常需要手动完成的事情。
我有两个文件(rev.fasta
和index_rev.fasta
),如下所示:
$ head rev.fasta
>1
bc-1
>2
bc-1
>3
bc-1
>4
bc-1
>5
bc-1
$ head necessary_files/index_rev.fasta
>rev-bc-1
TGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGG
>rev-bc-2
GTCTGTCGCCATGGAAAGTCAACTGTCTCGTGGGCTCGG
>rev-bc-3
TTGCTACGGTTGACCATGCAGTTAGTCTCGTGGGCTCGG
>rev-bc-4
AACTTGAGGTATCGTATATTCAATGTCTCGTGGGCTCGG
>rev-bc-5
GCAGGTGGGCATCCGGACCGATATGTCTCGTGGGCTCGG
我想编写 bash 命令
rev.fasta
与sed 's/>rev-//g' necessary_files/index_rev.fasta
相似grep
或相似的匹配- 将(例如)
bc-.*$
中找到的匹配替换为文件的下一行(例如for )rev.fasta
bc-1
necessary_files/index_rev.fasta
TGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGG
bc-1
结果是这样的:
>1
TGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGG
>2
TGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGG
>3
TGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGG
笔记:
一些可能很重要的信息:bc-
从1
到16
我不知道我该怎么做。我已经尝试了几件事,但我担心这可能比我目前的能力更复杂。有任何想法吗?
答案1
我对这个问题的理解是你想根据你的索引文件搜索fatsa文件。在我下面的回复中,索引文件称为patterns.txt。我还对该文件进行了一些更改以测试和演示该过程。阅读此答案后,您可以使用自己的pattern.txt 文件。
所以这里是假设:
$ cat fasta
>rev-bc-1
TGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGG
>rev-bc-2
GTCTGTCGCCATGGAAAGTCAACTGTCTCGTGGGCTCGG
>rev-bc-3
TTGCTACGGTTGACCATGCAGTTAGTCTCGTGGGCTCGG
>rev-bc-4
AACTTGAGGTATCGTATATTCAATGTCTCGTGGGCTCGG
>rev-bc-5
GCAGGTGGGCATCCGGACCGATATGTCTCGTGGGCTCGG
$ cat patterns.txt
>1
bc-4
>2
bc-2
首先运行此命令从 fasta 文件中提取patterns.txt 所需的内容:
$ awk '/bc/{print}' patterns.txt | xargs -I{} awk -v q=$(echo {}) '($0 ~ q){getline; print}' fasta
AACTTGAGGTATCGTATATTCAATGTCTCGTGGGCTCGG
GTCTGTCGCCATGGAAAGTCAACTGTCTCGTGGGCTCGG
将此输出保存在临时文件中;我们称之为 fasout
现在运行第二个命令以获得最终结果:
awk '!/bc/{print}' patterns.txt | paste -d '\n' - fasout
>1
AACTTGAGGTATCGTATATTCAATGTCTCGTGGGCTCGG
>2
GTCTGTCGCCATGGAAAGTCAACTGTCTCGTGGGCTCGG
说明:第一个命令从patterns.txt 中提取包含bc-1、bc-2 等的行。然后将它们通过管道输送到第二个 awk(一次一个)以查找相应的行,找到后,使用 awk 的 getline 选项打印下一行。
第二个命令只是将pattern.txt 文件与fastout 合并,以便bc-1、bc-2 等行被fasout 的内容替换。
有一些我没有提到的警告,因为我不确定这是否确实是您想要的解决方案。如果是这样,那么我很乐意稍后编辑我的答案并包含它们。