使用另一个文件提取与 grep 匹配的行的一部分以及以下行,然后保存到新文件

使用另一个文件提取与 grep 匹配的行的一部分以及以下行,然后保存到新文件

我有一个文件,其中一行有 DNA 序列标识符,其正下方的下一行有 DNA 序列。 DNA序列很长,但排成一行。

文件1.fasta:

>AB244308.1.1447 233_28379 1..292

-------------------------------------------------- -------------------------------------------------- -------------------------------------------------GTGCAG -CCGC-CGC-GGTAATAC-GG-AGGAT-GCG-A-GCG-TTATC-CGG-ATTCATT-GG-GT-TTA--AAGGGTGCGCAGG-CGG-GCGT-AT---------- -----------------------AA----GTCA--------------------- --------------------------------GGG--G--TG--A-AA-TG--CC- AC-GG------------------------------------------------------------ -------------------------------------------------- --------------------------------------CT-C-AA-------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---CCGTGGA--AC----TG--CC---T--T---------------------------- T--GA-TA---C---------------------------------------------------- ------------T--GT--AT--GTC---------------------------- -------------------------------------------------- -------------------------------------------------- --TTGAGT--T-----T-AG------TT-GA---------------------AGTG---GG- C - - - - - - - - - - - - - - - - - - - - - - - - - -------------------------------------------------- ----------------------------------GG--A--ATG-------- -------------------------------------------------- -------------------------------------------------- ----------------------------------TAGC-AT--GT-AG-CG-GT--G---------- ----A--AA------------------------------------------ -------------------------------------------------- -------TG-C-AT-AG--AG-A-TG---------------------------------------- --CT------AC------AGA-AC-A-CC---------------------------------------- ----------------------GA--T--A--GC-GAA-G--GC----A----- -G--CTCA---CTA---------A--GT-TA---------------------------------------- -------------------------------------------------- -------------------------------------------------- -----------AG--------ACT--GA--CG-----C----------------- ----------------------------TC--A-TG--CA-CG-A--AA-GC---- G-TG--GG-G-AT-CA-AA-CA--GG-AT--------TA-G-ATA--------CC-CCC-GTA--GT -CC------------------------------------------------ -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------

该文件中有大约 112,000 个遵循该格式的序列。我有大约 20 个序列标识符,我想从 fasta 文件中提取它们并将其保存到另一个文件中。

序列标识符位于如下所示的 txt 文件中:

文件2.txt:

AB244308.1.1447
New.ReferenceOTU151 
New.CleanUp.ReferenceOTU19 
New.ReferenceOTU59
New.CleanUp.ReferenceOTU6

除了提取带有序列标识符的行之外,我还想提取带有 DNA 序列的以下行,并将所有这些打印到一个新的文本文件中。

我通过这个答案发现(如何从包含另一个文件列表中的字符串的文本文件中提取行?)我需要使用 grep 和 sed。我还找到了另一个答案(https://stackoverflow.com/questions/7103531/how-to-get-the-part-of-file-after-the-line-that-matches-grep-expression-first) 与获取 grep 匹配后的行相关。

不幸的是,我不确定如何继续结合这些答案以获得我想要的东西。

答案1

正如他们所说,剥猫皮的方法不止一种:

grep -F -f File2.txt -A 1 File1.fasta > File3.log

< File2.txt sed -e 's|[.]|\\&|g; s|.*|g/^>&/.,.+1W File3.log|' | ed -s - File1.fasta

在这里,我们使序列标识符适合ed动态生成批处理脚本。然后传递给ed它使用它来处理你的fasta文件并将结果存储在File3.log

答案2

如果你的序列总是在一行上(这不是标准的 fasta 格式,顺便说一句,fasta 通常每行有 60 个字符),这是微不足道的。只需使用grepwith-A 1打印匹配行和下一行,并-f为其提供要搜索的模式列表:

grep -A1 -f File2.txt File1.fasta 

但是,如果您调用了一个序列>foobar并命名了另一个序列>foo并且您搜索foo.在这种情况下它将打印两者。有关更复杂的解决方案,请参阅我的答案这里。如果您想要retrievesqs.pl 脚本,请告诉我,那里的链接不再提供该脚本。我需要更新该答案。

答案3

是否有 20 个标识符中每一个的 txt 文件?然后假设它们被称为sequence1.txt等等(请适应),做

for file in sequence*.txt; do
  id=`grep AB $file`
  grep $id -A1 $file1.fasta |grep -v $id
done

第二行假设 id 始终包含AB.如果不是,也许它总是第一行,然后使用它head -1 $file

第三行提取 id 行和后续行。第二个 grep 删除 id 行。如果您想要 id 行和序列一起输出,则可以将其删除,这样您就知道哪个序列对应哪个 id。

使用附加grep选项,-m1您可以稍微加快搜索速度,因为您知道,文件中只有一个匹配项。

相关内容