June 2, 2008

Blast results made easier

#! /bin/bash

#version 0.0...1 !! ..not elegant but works..

#   Blast results made easier.
#   This script extracts the information contained in the .htm page output
#   of Blast (http://www.ncbi.nlm.nih.gov/blast), writing a simpler table
#   in html format, that you can for example load on a spreadsheet
#   (openoffice or excel - if you really want it).
#
#   Usage :
#                ./blast2table INPUT OUTPUT
#   where:
#       INPUT = input file,
#           that must be the .htm saved blast webpage with the results
#       OUTPUT = output file where the table will be saved, in html format.
#           It will have automatically the .html extension
#
#
# Note if this is the FIRST TIME time you use this !
# you need to convert this file into an executable file before running it,
# So the first thing to do is to type:
#
# chmod u+x blast2table.sh
#
# --------------------------------------------------------------------------
# 1001miglia.blogspot.com
# ![[use modify distribute cite]]!



# numero di righe dove compare Accession
grep -n Accession $1 | cut -d: -f1 > grep.1

# numero di samples nella pagina html
ntot=$(grep -n Query= $1 | awk 'END {print NR}')

# nomi dei samples, campo dopo Query= , scritto in file grep.2
awk '/Query=/{print $2}' $1 > grep.2

# trova il campo relativo a Length= e lo manda al file grep.3
grep -A1 Query= $1 | grep Length= | cut -d= -f2 > grep.3

# righe (+2) dove finiscono i titoli di ogni sample (Links), al file grep.4
grep -n Links $1  | cut -d: -f1 > grep.4

# crea il file aaa.tmp.1 e inserisce la prima linea per la tabella html
echo \<table\> > aaa.tmp.1

# riga della prima ripetizione di Accession nel file html :
n1=$(awk 'NR==1' grep.1)

# riga prima ripetizione Links
n1a=$(awk 'NR==1' grep.4)

# taglia via il file html prima della riga n1 e dopo n1a, mette in aaa.tmp.1.
# ci sono i titoli da Accession a Links piu' quelli aggiunti da me Query Length
awk 'NR>='$n1' && (NR<='$n1a'+2)' $1 >> aaa.tmp.1
sed 's/<table>/& <th>Query<\/th><th>Length<\/th>/' <aaa.tmp.1 > aaa.tmp.1a
mv aaa.tmp.1a aaa.tmp.1

# file originale tagliato dopo i primi titoli :
#awk 'NR>'$n1a'' $1 > aaa.tmp.2

  for i in $(seq 1 $ntot)
  do

      #num riga con i-esima ripetizione di Links
      n6=$(awk 'NR=='$i'' grep.4)

      # taglia via dal file html prima di n6
      awk 'NR>'$n6'+2' $1 > aaa.tmp.2

      # num di linea aaa.tmp.2 finisce la prima tabella da cui prendere valori :
      n2=$(grep -n -m1 \</table\>\</div\> aaa.tmp.2 | cut -d: -f1)

      # taglia via aaa.tmp.2 dopo la riga n2
      awk 'NR<'$n2'' aaa.tmp.2 > aaa.tmp.3

      # nome del sample i-esimo:
      n3=$(awk 'NR=='$i'' grep.2)

      echo "Found sample number "$i" , named "$n3

      # length del sample i-esimo :
      n4=$(awk 'NR=='$i'' grep.3)

      # agiunge le righe di query e length :
      sed 's/<td class="l">/<td>'$n3'<\/td><td>'$n4'<\/td>&/' <aaa.tmp.3 >> aaa.tmp.1

  done

# finisce la tabella html
echo \</table\> >> aaa.tmp.1

# output file :
mv aaa.tmp.1 $2.html

rm aaa* grep*

No comments: