This is a test version of Biostars. For the public version, visit https://www.biostars.org.
How To Edit Contig Format??

Hi I have some contig like that :

  >NODE_1_length_262931_cov_39.3702_ID_6774944
    GACGGTGGCAGTGTGGTGTTCCCGCCGGTGCTGGTGCAGATGCTCGACCGGCTGGAAAGT
    GAAATCCTGGCTGACCGGGTGAGTGAGGAAAGCCGCCGCTGGCTGGCATCGTGCGGCCTG
    ACGGTGGAGCAGATGCAAAACCAGATGGACCCGGTGTACACGCCGGCGCGAAAAATCCAC
    CTGTACCACTGCGACCATCGCGGCCTGCCGCTGGCCCTTATCAGTAAGGAAGGGGCAACA  
    >NODE_2_length_249731_cov_38.5539_ID_6775452
    TGAGGCAGCACCTGGCACGGCTGGGACGGAAGTCGCTGTCGTTCTCAAAATCGGTGGAGC
    TGCATGACAAAGTCATCGGGCATTATCTGAACATAAAACACTATCAATAAGTTGGAGTCA
    TTACCAACATCGTGAAAGAAATCCACAATAATGATCTTAAGCAGCAATTGATGAGTGAAT
 .....................................................................................................................

I Need like this each sequence in single line like that

   >NODE_1_length_262931_cov_39.3702_ID_6774944
   GACGGTGGCAGTGTGGTGTTCCCGCCGGTGCTGGTGCAGAT..............
   >NODE_2_length_249731_cov_38.5539_ID_6775452
   TGAGGCAGCACCTGGCACGGCTGGGACGGAAGTCGCTGTCGTTCTCAAAATCGGTGGAGC............................................

How can i convert the formate using sed/awk/perl

Thank you advance

awk perl

I'm intrigued as to what software requires single-line sequence in Fasta? It should not matter...

3 answers

Here you go:

cat foo.fa | awk 'BEGIN{ORS="";OFS="";}{if(NR == 1) {print $0,"\n"} else {if(substr($0, 1, 1) == ">") {print "\n",$0,"\n";} else {print $0;}}}END{print "\n";}'

Or if you want it formatted so you can actually follow along:

cat foo.fa | awk '
BEGIN{
    ORS="";
    OFS="";
}
{
    if(NR == 1) {
        print $0,"\n"
    } else {
        if(substr($0, 1, 1) == ">") {
            print "\n",$0,"\n";
        } else {
            print $0;
        }
    }
}
END{
    print "\n";
}'

Thank you So much For your Kind Suggestion

FYI, you'll need a > new_file.fa on the end there. I forgot to mention that!

Here's a Perl option:

use strict;
use warnings;
use 5.014;

$/ = '>';

while (<>) {
    chomp;
    say '>' . (s/.+?\n\K(.+)/$1 =~ s!\n!!gr/ser) if /\S/;
}

Usage: perl script.pl inFile [>outFile]

The last, optional parameter directs output to a file.

This reads the file in 'chunks,' using '>' as the record separator, \ Keeps the header info, removes all newlines from the captured sequence, and then prints the results.

Output on your dataset:

>NODE_1_length_262931_cov_39.3702_ID_6774944
GACGGTGGCAGTGTGGTGTTCCCGCCGGTGCTGGTGCAGATGCTCGACCGGCTGGAAAGTGAAATCCTGGCTGACCGGGTGAGTGAGGAAAGCCGCCGCTGGCTGGCATCGTGCGGCCTGACGGTGGAGCAGATGCAAAACCAGATGGACCCGGTGTACACGCCGGCGCGAAAAATCCACCTGTACCACTGCGACCATCGCGGCCTGCCGCTGGCCCTTATCAGTAAGGAAGGGGCAACA  
>NODE_2_length_249731_cov_38.5539_ID_6775452
TGAGGCAGCACCTGGCACGGCTGGGACGGAAGTCGCTGTCGTTCTCAAAATCGGTGGAGCTGCATGACAAAGTCATCGGGCATTATCTGAACATAAAACACTATCAATAAGTTGGAGTCATTACCAACATCGTGAAAGAAATCCACAATAATGATCTTAAGCAGCAATTGATGAGTGAAT

Hope this helps!

Thank you so much........

Here are some other suggestions for converting multi-line records to single line. With seqtk:

seqtk seq -l0 in.fa > out.fa

Or, with a slightly longer line using Bioperl (not using the best practices, just a short example):

perl -MBio::SeqIO -e '$seqio = Bio::SeqIO->new(-file => shift); while ($seq = $seqio->next_seq) { print ">".$seq->id, "\n", $seq->seq, "\n"; }' in.fa > out.fa

Log in to answer this question.