text: user180: What's an efficient way of counting of dinucleotides/trinucleotide pattern on fastq.gz file reads?
  I know there are tools like seqtk that will be very efficient at reading through the .fastq.gz files, and tools like cutadapt that are good at finding long(ish) adapter patterns in the fastq.gz PE of files, but, what would be the best tool to count the number of reads where a di-/trinucleotide is present N-number of times in the read? 
  E.g.
  countingtool --pattern CGC file_R1.fastq.gz
  
  Result: column two is number of times the pattern is seen (exclusive numbers, no overlap)
  CGC    0     51341234
  CGC    1     13948130
  CGC    2      1234344
  CGC    3        51344
  CGC    4         1343
  
  
  user298: Well, I'm sure you can find a more efficient approach, but here's a simplistic solution using standard UNIX tools:
  zcat file.fastq.gz | grep CGC | 
      awk -F'CGC' 'NR%4==2{a[NF-1]++}END{for(i in a){print i,a[i]}}' |
           sort -rnk2   
  
  I tested this on a 2.6G fastq file (exome data) and it took:
  real    1m18.987s
  user    1m41.392s
  sys     0m10.684s
  
  On a 66G WGS sequence file, it took:
  real    34m6.771s
  user    40m16.452s
  sys     4m10.176s
  
  The extra grep CGC isn't needed, you can do the match in awk, but it does speed things up a little bit. You can always get the reads with 0 matches by counting the number of reads and subtracting the ones with 1. Alternatively, remove the grep:
  zcat file.fq.gz | awk -F'CGC' 'NR%4==2{a[NF-1]++}END{for(i in a){print i,a[i]}}' |
      sort -rnk2   
  
  
  Following the OP's suggestion, I also tested with pigz and, it turns out, pigz can fly!
  time unpigz -c exome.fastq.gz | grep CGC | 
      awk -F'CGC' 'NR%4==2{a[NF-1]++}END{for(i in a){print i,a[i]}}' |
           sort -rnk2
  
  
  real    0m44.012s
  user    1m19.544s
  sys     0m14.900s
  
  And for the 66G WGS:
  real    17m29.935s
  user    29m23.816s
  sys     5m17.856s
  
  
original_text: 180: <p>What's an efficient way of counting of dinucleotides/trinucleotide pattern on fastq.gz file reads?</p>
  
  <p>I know there are tools like seqtk that will be very efficient at reading through the .fastq.gz files, and tools like cutadapt that are good at finding long(ish) adapter patterns in the fastq.gz PE of files, but, what would be the best tool to count the number of reads where a di-/trinucleotide is present N-number of times in the read? </p>
  
  <p>E.g.</p>
  
  <pre><code>countingtool --pattern CGC file_R1.fastq.gz
  </code></pre>
  
  <p>Result: column two is number of times the pattern is seen (exclusive numbers, no overlap)</p>
  
  <pre><code>CGC    0     51341234
  CGC    1     13948130
  CGC    2      1234344
  CGC    3        51344
  CGC    4         1343
  </code></pre>
   298: <p>Well, I'm sure you can find a more efficient approach, but here's a simplistic solution using standard UNIX tools:</p>
  
  <pre><code>zcat file.fastq.gz | grep CGC | 
      awk -F'CGC' 'NR%4==2{a[NF-1]++}END{for(i in a){print i,a[i]}}' |
           sort -rnk2   
  </code></pre>
  
  <p>I tested this on a 2.6G fastq file (exome data) and it took:</p>
  
  <pre><code>real    1m18.987s
  user    1m41.392s
  sys     0m10.684s
  </code></pre>
  
  <p>On a 66G WGS sequence file, it took:</p>
  
  <pre><code>real    34m6.771s
  user    40m16.452s
  sys     4m10.176s
  </code></pre>
  
  <p>The extra <code>grep CGC</code> isn't needed, you can do the match in awk, but it does speed things up a little bit. You can always get the reads with 0 matches by counting the number of reads and subtracting the ones with 1. Alternatively, remove the <code>grep</code>:</p>
  
  <pre><code>zcat file.fq.gz | awk -F'CGC' 'NR%4==2{a[NF-1]++}END{for(i in a){print i,a[i]}}' |
      sort -rnk2   
  </code></pre>
  
  <hr>
  
  <p>Following the OP's suggestion, I also tested with <code>pigz</code> and, it turns out, pigz can fly!</p>
  
  <pre><code>time unpigz -c exome.fastq.gz | grep CGC | 
      awk -F'CGC' 'NR%4==2{a[NF-1]++}END{for(i in a){print i,a[i]}}' |
           sort -rnk2
  
  
  real    0m44.012s
  user    1m19.544s
  sys     0m14.900s
  </code></pre>
  
  <p>And for the 66G WGS:</p>
  
  <pre><code>real    17m29.935s
  user    29m23.816s
  sys     5m17.856s
  </code></pre>
  