如何根据长度条件将字符串分解为较小的子字符串?

如何根据长度条件将字符串分解为较小的子字符串?

我有一个文件,其中包含一些基因序列,如下所示:

tgcaccaaacatgtctaaagctggaaccaaaattactttctttgaagacaaaaactttcaaggccgccactatgacagcgattgcgactgtgcagatttccacatgtacctgagccgctgactccatcagagtggaaggaggcacctgggctgtgtatgaaaggcccaattttgctgggtacatgtacatcctaccccggggcgagtatcctgagtaccagcactggatgggcctcaacgaccgcctcagctcctgcagggctgttcacctgtctagtggaggccagtataagcttcagatctttgagaaaggggattttaatggtcagatgcatgagaccacggaagactgcccttccatcatggagcatccacatgcgggaggtccactcctgtaaggtgctggagggcgcctggatcttctatgagctgcccaactaccgagcaggcagtacctgctggacaagaaggagtaccggaagcccgtcgactggggtgcagcttccccagctgtccagctttccgccgcattgtggagtgatgatacagatgcggccaaacgctggctggccttgtcatccaaataagcattataaataaaacaattggcatgc

MDITIHNPLIRRPLFSWLAPSRIFDQIFGEHLQESELLPASPSLSPFLMRSPIFRMPSWLETGLSEMRLEKDKFSVNLDVKHFSPEELKVKVLGDMVEIHGKHEERQDEHGFIAREFNRKYRIPADVDPLTITSSLSLDGVLTVSAPRKQSDVPERSIPITREEKPAIAGAQRKMDITIHNPLIRRPLFFSPEELKVKVLGDMVEIHGKHEERQDEHGFIAREFNRKYRIPADVDPLTITSSLSLDGVLTVSAPSRIFDQIFGEHLQESELLPASPSLSPFLMRSPIFRMPSWLETGLSEMRLEKDKFSVNLDVKHFSPEELKVKVLGDMVEIHGKHEERQDEHGFIAREFNRKYRIPADVDPLTITSSLSLDGVLTVSAPRKQSDVPERSIPITREEKPAIAGAQRKMDITIHNPLIRRPLFFSPEE

SWLAPSRIFDQIFGEHLQESELLPASPSLSPFLMRSPIFRMPSWLETGLSEMRLEKDKFSVNLDVKHFSPEELKVKVLGDMVEIHGKHEERQDEHGFIAREFNRKYRIPADVDPLTITSSLSLDGVLTVSAPRKQDVPERSIPITREEKPAIAGAQRIFGEHLQESELLPASPSLSPFLMRSPIFRMPSWLETGLSEMRLEKDKFSVNLDVKHFSPEELKVKVLGDMVEIHGKHEERQDEHGFIAREFNRKYRIPADVDPLTITSSLSLDGVLTVKFGEHLQESELLPASPSLSPFLMRSPIFRMPSWLETGLSEMRLEKDKFSVNLDVKHFSPEELKVKVLGDMVEIHGKHEERQDEHGFIAREFNRKYRIPADVDPLTITSSLSLDGVLTVSAPRKQDVP

每个序列都表示为一行。我想将每一行作为一组行,其中每一行的长度都小于 80 个字符。如何将每一行分成一组,使​​长度小于 80 个字符?

答案1

您的解决方案有效,只是可以简化,加上保存的输出,并提供反馈:

$ sed -r 's/(.{79})/\1\n/g' output.txt | tee output2.txt
  • sed命令已经可以接受文件...这样的参数,output.txt这样你就可以避免一些人认为的“虐待猫科动物”:)
  • tee允许您查看输出并编写输出,从而为您提供一种反馈形式,否则对于大文件会发生的情况是屏幕上一段时间内似乎什么也没有发生,因此获得反馈总是好的。

答案2

为什么有人报价fold

fold infile > outfile

从手册页:

NAME
       fold - wrap each input line to fit in specified width

SYNOPSIS
       fold [OPTION]... [FILE]...

使用 -w 覆盖默认值 80。

答案3

使用 sed,如果您的数据文件是data.txt并且您想要输出到文件broken.txt

sed -n 'l 80' data.txt | sed 's/\$\|\\//' > broken.txt

管道的第一部分使每行长度为 80 个字符。然而,sed 中的这个方便的命令以“明确”的形式输出文本,这意味着换行符现在变为$s,并且 sed 放入的换行符呈现为\s。所以管道的第二部分就是去掉那些。

此解决方案假设data.txt 中没有\s 或。$

答案4

\当像这样分割行时,相当常见的做法是通过用字符标记行的末尾或行的开头来指示该行已被分割(并且旨在将其视为/使用/读取为一行)。用一些空格(例如 2 个空格字符)或两者来分割行。

以下 sed 脚本同时执行这两项操作,并确保每行的宽度不能超过 79 个字符(因此适合在 80 列终端或打印机上显示)。

sed -r 's/(.{75})/\1 \\\n  /g' geneseq.txt

这不仅使得在视觉上更清楚应该连接哪些行,而且如果您稍后需要进一步处理它,也可以更轻松地重复使用输出。

相关内容