首页 > 解决方案 > 根据标题拆分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 循环。任何关于我能做什么的指导将不胜感激。

标签: linuxbashfor-loopnested-loopsfasta

解决方案


您将通过使用不需要一直打开和关闭文件的工具来提高性能。awk 是一个很好的选择。

在我看来,可以通过以下方式获得与您所写内容类似的结果:

$ awk '/^>/ { file=substr($1,2) ".fasta" } { print > file }' *.faa

请注意,除非您close()是一个文件,否则 awk 会在 awk 进程完成之前将其保持打开状态,因此如果它们出现在多个输入文件中,上述解决方案将附加到常见的片段名称。

如果您有大量此类文件(数万个),则*.faa可能会扩展为太多文件,您的 shell 无法在一个命令行上处理。如果是这种情况,您可以使用find.


推荐阅读