我有一个包含数百万个配对序列的 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;}
:如果$c
是3
,则>NNNNN
删除行>
和换行符。elsif($c==4){$c=0}'
: 如果$c
是4
,请重新设置0
。
请注意,这假设是配对读取。如果文件中的每一次正向读取都没有恰好一次反向读取,它将失败。它还假设您的序列位于一行上。 Fasta 文件通常每个序列有多行,默认为剪切 60 个字符。近年来这种情况发生了变化,但格式仍然允许多行序列。