删除图案周围的新行字符

删除图案周围的新行字符

我有一个包含数百万个配对序列的 fasta 文件,如下所示:

>7001289F:56:HKH3FBCXX:2:1101:1692:2074 1:N:0:CGATGT
GAGCAGAGGCACCGCTGAGCAGACAGCGAGCGAGTGAAGGGGTCAGGGGCCAGTCAGCAATCTCGTGTAGAAAGAATCACGGTCGAGCGGTGCACGCATG
>NNNNN
GACACCTTCATTTCCACTTTATTGAGCAGCGGCGCATGCGTGCACCGCTCGACCGTGATTCTTTCTACACGAGATTGCTGACTGGCCCCTGACCCCTTCA
>7001289F:56:HKH3FBCXX:2:1101:1522:2186 1:N:0:CGATGT
GTAGATGATGAATACAGCTGTTGCTGCAGCAACTGGTGCTGAGTAAGCAACTGCGATCCATGGACGCATACCTAAACGGAAAGATAATTCCCAC
>NNNNN
GTGGGAATTATCTTTCCGTTTAGGTATGCGTCCATGGATCGCAGTTGCTTACTCAGCACCAGTTGCTGCAGCAACAGCTGTATTCATCATCTAC

我需要将其格式化如下:

>7001289F:56:HKH3FBCXX:2:1101:1692:2074 1:N:0:CGATGT
GAGCAGAGGCACCGCTGAGCAGACAGCGAGCGAGTGAAGGGGTCAGGGGCCAGTCAGCAATCTCGTGTAGAAAGAATCACGGTCGAGCGGTGCACGCATGNNNNNGACACCTTCATTTCCACTTTATTGAGCAGCGGCGCATGCGTGCACCGCTCGACCGTGATTCTTTCTACACGAGATTGCTGACTGGCCCCTGACCCCTTCA
>7001289F:56:HKH3FBCXX:2:1101:1522:2186 1:N:0:CGATGT
GTAGATGATGAATACAGCTGTTGCTGCAGCAACTGGTGCTGAGTAAGCAACTGCGATCCATGGACGCATACCTAAACGGAAAGATAATTCCCACNNNNNGTGGGAATTATCTTTCCGTTTAGGTATGCGTCCATGGATCGCAGTTGCTTACTCAGCACCAGTTGCTGCAGCAACAGCTGTATTCATCATCTAC

基本上,复杂的标头代表 DNA 序列的正向读取,紧随其后的标头代表相应的反向读取,标头为 NNNNN。我需要将这些反向读取附加到仅用 NNNNN 分隔的正向读取中,但很难用 sed 删除换行符。有人能解释一下吗?

答案1

如果您的文件足够小以适合内存,您可以执行以下操作:

perl -00pe 's/\n>(NNNNN)\n/$1/g' file

由于您的文件几乎肯定太大而无法加载到 RAM 中,因此您可以使用以下命令:

$ perl -pe '$c++; if($c==2){chomp}
                  elsif($c==3){s/[>\n]//g;}
                  elsif($c==4){$c=0}' file.fa
>7001289F:56:HKH3FBCXX:2:1101:1692:2074 1:N:0:CGATGT
GAGCAGAGGCACCGCTGAGCAGACAGCGAGCGAGTGAAGGGGTCAGGGGCCAGTCAGCAATCTCGTGTAGAAAGAATCACGGTCGAGCGGTGCACGCATGNNNNNGACACCTTCATTTCCACTTTATTGAGCAGCGGCGCATGCGTGCACCGCTCGACCGTGATTCTTTCTACACGAGATTGCTGACTGGCCCCTGACCCCTTCA
>7001289F:56:HKH3FBCXX:2:1101:1522:2186 1:N:0:CGATGT
GTAGATGATGAATACAGCTGTTGCTGCAGCAACTGGTGCTGAGTAAGCAACTGCGATCCATGGACGCATACCTAAACGGAAAGATAATTCCCACNNNNNGTGGGAATTATCTTTCCGTTTAGGTATGCGTCCATGGATCGCAGTTGCTTACTCAGCACCAGTTGCTGCAGCAACAGCTGTATTCATCATCTAC

解释

  • perl -pe '...' file.fa:对于输入文件的每一行,运行和rintfile.fa给出的脚本。-e-p
  • $c++:每行将变量加$c一。
  • if($c==2){chomp}$c:如果当前值为2,则删除行尾的换行符。这与正向序列的行相匹配。
  • elsif($c==3){s/[>\n]//g;}:如果$c3,则>NNNNN删除行>和换行符。
  • elsif($c==4){$c=0}': 如果$c4,请重新设置0

请注意,这假设是配对读取。如果文件中的每一次正向读取都没有恰好一次反向读取,它将失败。它还假设您的序列位于一行上。 Fasta 文件通常每个序列有多行,默认为剪切 60 个字符。近年来这种情况发生了变化,但格式仍然允许多行序列。

相关内容