2009-10-08 17 views
5

tengo salida del programa que se parece a esto (pestaña delim):¿Cómo puedo aplicar la transliteración (tr) de Unix/Sed/Perl a solo una columna específica?

$ ./mycode somefile 
    0000000000000000000000000000000000  238671 
    0000000000000000000000000000000001  0 
    0000000000000000000000000000000002  0 
    0000000000000000000000000000000003  0 
    0000000000000000000000000000000010  0 
    0000000000000000000000000000000011  1548.81 
    0000000000000000000000000000000012  0 
    0000000000000000000000000000000013  937.306 

Lo que quiero hacer es en la primera columna única: sustituir a 0 con A, 1 con C, 2 con G, y 3 con T ¿Hay alguna manera de transcribir esa salida directamente desde "mycode"? Ceder esto:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA  238671 
... 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACT  937.306 
+1

¿Alguien puede sugerir cómo podríamos hacerlo usando awk?. Creo que sería útil. – Vijay

Respuesta

7

Debería ser posible hacerlo con sed, poner esto en un archivo (que puede hacerlo de línea de comandos para, con -e, simplemente no se olvide de esos puntos y comas, o el uso separar -e para cada línea). (EDITAR: Tenga en cuenta que, como sus datos están delimitados por tabulaciones, de hecho debe ser un carácter de tabulación, no un espacio, en las primeras s //, asegúrese de que su editor no lo convierta en espacios)

#!/usr/bin/sed -f 

h 
s/ .*$// 
y/0123/ACGT/ 
G 
s/\n[0-3]*// 

y utilizar

./mycode somefile | sed -f sedfile 

o chmod 755 sedfile y no

./mycode somefile | sedfile 

Las etapas llevadas a cabo son:

  1. búfer de copia para mantener el espacio (en sustitución de contenido de retenida de la línea anterior, si los hay)
  2. remove posterior cosas (de primer espacio hasta el final de línea)
  3. transliterate
  4. anexar contenido de espacio de bodega
  5. eliminar la nueva línea (desde el paso adjunto) y todos los dígitos que la siguen (hasta el espacio)

Funcionó al menos para mí en sus datos.

EDITAR:
Ah, que quería una sola línea ...

sed de GNU

sed -e "h;s/ .*$//;y/0123/ACGT/;G;s/\n[0-3]*//" 

o la vieja escuela sed (no hay punto y coma)

sed -e h -e "s/ .*$//" -e "y/0123/ACGT/" -e G -e "s/\n[0-3]*//" 
8

Utilizando Perl:

 
C:\> ./mycode file | perl -lpe "($x,$y)=split; $x=~tr/0123/ACGT/; $_=qq{$x\t$y}" 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA  238671 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC  0 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG  0 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT  0 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA  0 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACC  1548.81 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACG  0 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACT  937.306 

Puede utilizar comillas simples en Bash:

 
$ ./mycode file | perl -lpe '($x,$y)=split; $x=~tr/0123/ACGT/; $_="$x\t$y"' 

Como @ysth notas en los comentarios, perl realidad ofrece las opciones de línea de comandos y -a-F:

 
-a    autosplit mode with -n or -p (splits $_ into @F) 
... 
-F/pattern/  split() pattern for -a switch (//'s are optional) 

Usando los:

 
perl -lawnF'\t' -e '$,="\t"; $F[0] =~ y/0123/ACGT/; print @F' 
+2

o con -F: perl -laFF '/ \ t /' -e '$, = "\ t"; $ F [0] = ~ y/0123/ACGT /; print @F ' – ysth

+0

@ysth Siempre me olvido de '-F'. –

3

@sarathi

\ AWK solución para este

awk '{gsub("0","A",$1);gsub("1","C",$1);gsub("2","G",$1);gsub("3","T",$1); print $1"\t"$2}' temp.txt 
Cuestiones relacionadas