2009-10-08 3 views
5

J'ai sortie de programme qui ressemble à ceci (onglet delim):Comment puis-je appliquer transliterate (tr) d'Unix/Sed's/Perl à seulement une colonne spécifique?

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

Ce que je veux faire est de première colonne seulement: remplacer 0 avec A, 1 avec C, 2 avec G et 3 avec T Existe-t-il un moyen de translittérer cette sortie directement à partir de "mycode". Cédant ceci:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA  238671 
... 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACT  937.306 
+1

quelqu'un peut-il suggérer comment pourrions-nous le faire en utilisant awk?. Je pense que ce serait utile. – Vijay

Répondre

7

Il devrait être possible de le faire avec sed, mettre cela dans un fichier (vous pouvez le faire en ligne de commande, avec -e, il suffit de ne pas oublier ces points-virgules, ou l'utilisation séparer -e pour chaque ligne). (EDIT: Gardez à l'esprit, puisque vos données sont délimitées par des tabulations, il devrait en fait être un caractère de tabulation, pas un espace, dans les premiers //, assurez-vous que votre éditeur ne les transforme pas en espaces)

#!/usr/bin/sed -f 

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

et utiliser

./mycode somefile | sed -f sedfile 

ou chmod 755 sedfile et ne

./mycode somefile | sedfile 

Les étapes réalisées sont:

  1. tampon de copie pour maintenir l'espace (en remplaçant le contenu en attente de la ligne précédente, le cas échéant)
  2. supprimer étoffe arrière (de premier espace à la fin de la ligne)
  3. transliterate
  4. annexer le contenu de l'espace de maintien
  5. supprimer le saut de ligne (de l'étape append) et tous les chiffres suivants (au maximum l'espace)

travaillé pour moi sur vos données au moins.

EDIT:
Ah, vous vouliez en une ligne ...

GNU sed

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

ou old school sed (pas des points-virgules)

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

L'utilisation de 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 

Vous pouvez utiliser des guillemets simples dans Bash:

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

Comme @ysth notes dans les commentaires, perl fournit en fait les options de ligne de commande -a et -F:

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

En les utilisant:

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

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

+0

@ysth J'oublie toujours '-F'. –

3

@sarathi

\ solution AWK pour cette

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