linux - 根据标题拆分fasta文件
问题描述
我有 1,500 个 fasta 文件,其中包含许多蛋白质片段。我的目标是将这些片段分成单个文件,并以直观的方式命名这些文件。
这是我称为 plate9.H7.faa 的 fasta 文件的示例:
>39_fragment_4_295 (310978..311196) 1 None hypothetical protein
MQTATKQETYDRTMKVTLAVKANGGSVTVQIQAGDNWITTDTFWKDGGYQLSIPPATIRYVPAAGAAFEVYA*
>39_fragment_4_296 (311193..312437) 1 VOG01158 REFSEQ hypothetical protein
MSLLVNPIPRRQPIRRGLGLLGDSFSGNCHTIAATAFGTEAYGYAGWIAARTGLFPSYVDNQGKLGDHTGQFLARLPACIASSTADLWLLLSRTNDSTTAGMSLADTKANVMKIVTAFLNTPGKYLIIGTGTPRFGSRALTGQALADAIAYKDWVLSYVSQFVPVVNIWDGFTEAMTVEGLHPNLLGAEFISSRVVPIITANFEFPGIPLPTDAGDIYSAIRPFGCLNANPLLAGTGGTLPAGVNAAAGSVLADGYKAVGSGLTGITTRWFKEPAAYGEAQCIELRGNMAAAGGYIYMQPTANVVQTNLAAGDVIEMVSAVEIMGSSRGILAWEAELTITKTVSGAASTFYYRSMDKYQEPFTMPASFSGALETQRGTIDLTETVITSRMGLYLAAGVPQDSTVKAAQFGIRKV*
>56_fragment_9_667 (768674..769846) -1 K14059 int; integrase
MGRDGRGVRAVSDTSIEITFMYRGVRCRERITLKPSPTNLKKAEQHKAAIEHAISIGAFDYSVTFPGSPRAAKFAPEANRETVAGFLTRWLDGKKRHVSSSTFVGYRKLVELRLVPALGERMVVDLKRKDVRDWLSTLEVSNKTLSNIQSCLRSALNDAAEEELIEVNPLAGWTYSRKEAPAKDDDVDPFSPEEQQAVLAALNGQARNMMQFALWTGLRTSELVALDWGDIDWLREEVMVSRAMTQAAKGQAEVPKTAAGRRSVKLLRPAMEALKAQKAHTFLADAEVFQNPRTLQRWAGDEPIRKTMWVPAIKKAGVNYRRPYQTRHTYASMMLSAGEHPMWVAKQMGHSDWTMIARVYGRWMPYWDDIAGTKAVSQWAENAHESSDSK*
>56_fragment_9_668 (770054..770281) -1 PF02599.16 Global regulator protein family
MLCLSRRVGESIVIGDNIKITVISGRDGQIRLGIDAPAELAVDRSEVRTAKLATPCGIGLKLRTVAESGARDDEG*
>56_fragment_9_669 (770485..770697) 1 None hypothetical protein
MECTTTADEVYGPRNAKLGKRAVDGNIWSGTTMIFRIIDDRVYSMHEQYLGRLKYGMAMTDRGELIFIVR*
>56_fragment_9_670 (770705..771487) -1 VOG00563 sp|Q05292|VG77_BPML5 Gene 77 protein
MSESTIDPKKLERAIRKIKHCLALSQSSNENEAATAMRQAQALMREYHLTETDVKVSDVGEVESSMSRAARRPLWDQQLSAVVATVFNVKALRYTHWCETKKNRVERAKFVGVSPAQHIALYAYETLLAKLSQARNAYVAGVRAGKFRSSYSAPTAGDHFAIAWVFAVESKLQQLVPRGEENTTPEYKGAGPGLVAVEAQHQALIDSYLADKQVGKARKVRGSELDLNAQIAGMLAGTKVDLHAGLANGAEHAQVLPASA*
到目前为止,我已经能够使用以下命令将文件拆分为多个文件:
for x in *.faa; do csplit -z $x '/>/' '{*}'; done
然后根据标题中的片段重命名它们:
for file in xx*; do mv "$file" `head -1 "$file" | cut -d$'\t' -f 1`_$x.fasta; done
然后将每个文件重命名为没有每个文件中的“>”,并为其分配原始文件名:
for i in *.fasta; do mv $i `echo $i | cut -c 2-`; done
我的问题是这适用于单个文件(因为我正在执行此操作的目录中有临时文件,这些文件临时称为 xx00、xx01、xx02、xx03 等。
我觉得我的解决方案是遍历每个 fasta 文件并在开始下一个 fasta 文件之前连续执行所有这些 for 循环,我觉得这必须是我自己从未做过的嵌套 for 循环。任何关于我能做什么的指导将不胜感激。
解决方案
您将通过使用不需要一直打开和关闭文件的工具来提高性能。awk 是一个很好的选择。
在我看来,可以通过以下方式获得与您所写内容类似的结果:
$ awk '/^>/ { file=substr($1,2) ".fasta" } { print > file }' *.faa
请注意,除非您close()
是一个文件,否则 awk 会在 awk 进程完成之前将其保持打开状态,因此如果它们出现在多个输入文件中,上述解决方案将附加到常见的片段名称。
如果您有大量此类文件(数万个),则*.faa
可能会扩展为太多文件,您的 shell 无法在一个命令行上处理。如果是这种情况,您可以使用find
.
推荐阅读
- entity-framework - EFCore - 为什么我必须使子对象为空才能阻止它们插入?一对多
- python - 测试容器和 clickhouse 驱动程序错误:读取字节时出现意外的 EOF
- sql - SQL Schema for multiple many-to-many relationships
- javascript - Angular local reference issue in date picker
- google-cloud-platform - I have problem to connect me glassfish server from compute engine
- ios - How to send instant email with mail chimp in Swift?
- c# - 不允许请求的远程注册表访问
- javascript - Changing number in div to 2 decimal places
- mysql - How to optimize the "IN (SELECT..." query
- mysql - 1列中的Mysql百分比计算