如何用 file2 中的另一个字符串替换 file1 中的匹配字符串

如何用 file2 中的另一个字符串替换 file1 中的匹配字符串

我是一名分子生物学家,最近刚刚开始使用 bash,并尝试编写几个脚本来自动执行一些我通常需要手动完成的事情。

我有两个文件(rev.fastaindex_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 命令

  1. rev.fastased 's/>rev-//g' necessary_files/index_rev.fasta相似grep或相似的匹配
  2. 将(例如)bc-.*$中找到的匹配替换为文件的下一行(例如for )rev.fastabc-1necessary_files/index_rev.fastaTGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGGbc-1

结果是这样的:

>1
TGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGG
>2
TGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGG
>3
TGTGTTGAGACCACACAGGCCTCAGTCTCGTGGGCTCGG

笔记:

一些可能很重要的信息:bc-116

我不知道我该怎么做。我已经尝试了几件事,但我担心这可能比我目前的能力更复杂。有任何想法吗?

答案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 的内容替换。

有一些我没有提到的警告,因为我不确定这是否确实是您想要的解决方案。如果是这样,那么我很乐意稍后编辑我的答案并包含它们。

相关内容