![使用另一个文件提取与 grep 匹配的行的一部分以及以下行,然后保存到新文件](https://linux22.com/image/107928/%E4%BD%BF%E7%94%A8%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E6%8F%90%E5%8F%96%E4%B8%8E%20grep%20%E5%8C%B9%E9%85%8D%E7%9A%84%E8%A1%8C%E7%9A%84%E4%B8%80%E9%83%A8%E5%88%86%E4%BB%A5%E5%8F%8A%E4%BB%A5%E4%B8%8B%E8%A1%8C%EF%BC%8C%E7%84%B6%E5%90%8E%E4%BF%9D%E5%AD%98%E5%88%B0%E6%96%B0%E6%96%87%E4%BB%B6.png)
我有一个文件,其中一行有 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 个字符),这是微不足道的。只需使用grep
with-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
您可以稍微加快搜索速度,因为您知道,文件中只有一个匹配项。