package com.github.lindenb.jvarkit.tools.misc; import java.io.File; import java.io.PrintStream; import java.util.List; import htsjdk.samtools.fastq.FastqRecord; import htsjdk.samtools.ValidationStringency; import htsjdk.samtools.util.CloserUtil; import com.beust.jcommander.Parameter; import com.github.lindenb.jvarkit.util.jcommander.Launcher; import com.github.lindenb.jvarkit.util.jcommander.Program; import com.github.lindenb.jvarkit.util.log.Logger; import com.github.lindenb.jvarkit.util.picard.FastqReader; import com.github.lindenb.jvarkit.util.picard.FourLinesFastqReader; @Program(name="fastq2fasta",description="fastq -> fasta",deprecatedMsg="use awk, samtools...") public class FastqToFasta extends Launcher { private static final Logger LOG = Logger.build(FastqToFasta.class).make(); @Parameter(names={"-o","--output"},description="Output file. Optional . Default: stdout") private File outputFile = null; @Parameter(names="-N",description="fasta line length") private int fastaLineLen=50; @Parameter(names="-b",description="trim fasta header after space") private boolean trim_after_space=false; private FastqToFasta() { } private void run(FastqReader r,PrintStream out) { int wsp=0; long nRec=0L; r.setValidationStringency(ValidationStringency.LENIENT); while(r.hasNext()) { if(++nRec%1E6==0) { LOG.info("N-Reads:"+nRec); } FastqRecord fastq=r.next(); out.print(">"); if(!trim_after_space || (wsp=fastq.getReadHeader().indexOf(' '))==-1) { out.println(fastq.getReadHeader()); } else { out.println(fastq.getReadHeader().substring(0, wsp)); } int readLen=fastq.getReadString().length(); int i=0; while(i< readLen) { int end=Math.min(i+fastaLineLen,readLen); out.println(fastq.getReadString().substring(i, end)); i=end; } if(out.checkError()) break; } out.flush(); LOG.info("Done. N-Reads:"+nRec); } @Override public int doWork(List<String> args) { PrintStream out=null; try { out= super.openFileOrStdoutAsPrintStream(outputFile); if(args.isEmpty()) { LOG.info("Reading from stdin"); FastqReader fqR=new FourLinesFastqReader(stdin()); run(fqR,out); fqR.close(); } else for(String fname:args) { File f=new File(fname); LOG.info("Reading from "+f); FastqReader fqR=new FourLinesFastqReader(f); run(fqR,out); fqR.close(); } out.flush(); } catch(Exception err) { LOG.error(err); return -1; } finally { CloserUtil.close(out); } return 0; } public static void main(String[] args) { new FastqToFasta().instanceMainWithExit(args); } }