長さの条件に応じて、文字列をより小さな部分文字列に分割する方法は?

長さの条件に応じて、文字列をより小さな部分文字列に分割する方法は?

次の遺伝子配列を含むファイルがあります。

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

データファイルがあり、data.txtファイルに出力するにはsedを使用しますbroken.txt

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

パイプラインの最初の部分では、各行の長さを80文字にします。ただし、sedのこの便利なコマンドは、「明示的な」形式でテキストを出力します。つまり、改行文字は$sになり、sedが入力した改行文字はsとしてレンダリングされます\。したがって、パイプラインの2番目の部分はそれを削除することです。

\このソリューションは、data.txtにsまたはがないと仮定します。$

答え4

\このように行を分割するときは、行の終わりまたは行の先頭を文字で表示して行が分割されたことを(そして1行として扱い/使用/読み取る意図である)というのが非常に一般的です。空白(たとえば、2つの空白文字)またはその両方を使用して行を区切ります。

次のsedスクリプトは両方を実行し、各行が79文字を超えてはいけません(したがって、80列の端末またはプリンタに表示するのに適しています)。

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

これにより、どのラインを接続するかを視覚的に明確にするだけでなく、後でさらに処理する必要がある場合に出力をより簡単に再利用できます。

関連情報