[Help] Sed & Expressions Régulières

Sed & Expressions Régulières [Help] - Shell/Batch - Programmation

Marsh Posté le 15-02-2011 à 20:49:15    

Hello
 
Tout d'abord n'ayez pas peur à la vue de mon sujet c'est bien plus simple qu'il n'y parait ^^ J'explique mon but de manière précise afin que vous puissiez m'aider de manière plus efficace
 
Je souhaiterai ajouter un certain nombre à un nombre existant dans un fichier.
Je m'explique.
 
Je travaille sur base d'un fichier texte contenant des séquences d'adn.
Chaque séquence se voit attribuer un numéro (format "FASTA" si ça vous intéresse).
 
Voici un exemple type de fichier fasta contenant de l'ADN:
 

Citation :


>01
ADN (séquence d'ADN)
>02
ADN'
>03
ADN''
etc...

Mon fichier possède en réalité 50 séquences, donc numérotées de 00 à 49.

Citation :


>00
ADN
>...
ADN''''
>49
ADN'''''''''

Pour vous éparger les détails, je dois effectuer une modification sur toutes ces séquences, en réalité inverser leur ordre :

Citation :


ATCG
deviendrait
GCTA

Je dispose et maitrise les outils pour faire cette opération.
 
Voici mon problème :
Je dois AJOUTER au fichier de base (séquences 00 à 49, ordre initial "ATCG" ) ce meme fichier mais dont les séquences ont été inversées (je sais le faire no soucy) mais j'ai besoin que le numérotation continue.
Ainsi :

Citation :


>00
ATCG
>01
AATC
 
...
 
deviendraient :
>50
GCTA
>51
CTAA
 
...
 

Comment puis-je faire ?
Les tutos sont légion sur internet, mais cela devient très vite compliqué et nous apprenons sed "sur le tas" (et sans mentir j'en ai un peu ras le bol des tutos ).
 
Pour résumer, comment ajouter un nombre (dans ce cas-ci "50" ) à un nombre existant (dans ce cas-ci de "00" à "49" ) afin d'automatiser la tache ?
 
En espérant ne pas avoir abusé avec mon poste, merci beaucoup à ceux qui tenteront de m'aider :D

Reply

Marsh Posté le 15-02-2011 à 20:49:15   

Reply

Marsh Posté le 15-02-2011 à 21:56:30    

Utilises un langage plus adapté, comme perl
Par exemple, ce script (test.pl)

Code :
  1. #!/usr/local/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. my @a = <>;
  6. my $inc;
  7. foreach (@a) {
  8.    next if (/^[ \t\n]+$/);
  9.    if (/^>(\d+)/) { $inc = $1; }
  10.    print;
  11. }
  12. foreach (@a) {
  13.    next if (/^[ \t\n]+$/);
  14.    if (/^>/) {
  15.     s/(\d+)/++$inc/e;
  16.    }
  17.    else {
  18.     chop;
  19.     $_ = reverse $_;
  20.     $_.= "\n";
  21.    }
  22.    print;
  23. }

Sur un fichier test comme celui ci:
ADN.txt

Citation :

>01
ADN
>02
ADNGAC
>03
ADNGCT


le script perl appelé par: perl test.pl ADN.txt donne:

Citation :

>01
ADN
>02
ADNGAC
>03
ADNGCT
>04
NDA
>05
CAGNDA
>06
TCGNDA

 

Bon sinon, un script moins général comme celui ci:

Code :
  1. #!/usr/local/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5.  
  6. if ($#ARGV < 1) {
  7.    die("Not enough arguments \n" );
  8. }
  9. open(INP, "<$ARGV[0]" ) or die("Cannot open file '$ARGV[0]' for reading\n" );
  10. my @a = <INP>;
  11. close INP;
  12. my $inc = $ARGV[1];
  13. foreach (@a) {
  14.    next if (/^[ \t\n]+$/);
  15.    if (/^>/) {
  16.     s/(\d+)/++$inc/e;
  17.    }
  18.    else {
  19.     chop;
  20.     $_ = reverse $_;
  21.     $_.= "\n";
  22.    }
  23.    print;
  24. }

appelé par: perl test.pl ADN.txt 30 donne:

Citation :

>34
NDA
>35
CAGNDA
>36
TCGNDA

 

Je détaillerais si ça t'intéresse.
A+,


Message édité par gilou le 15-02-2011 à 22:21:23

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-02-2011 à 21:58:50    

Alors je me tente à programmer en Shell dans un forum (désolé g po linux sous la main). On va voir si je suis rouillé (je suis dans l'univers CroSoft depuis quelques mois) donc :
 
#!/bin/ksh
# $1 sera ton fichier de début
# $2 sera celui à ajouter à la fin
# $3 ton fichier de sortie
typeset -i LAST_NUMBER
LAST_NUMBER=`grep '>' $1 | tail -1 | cut -c2-`
cat $1 > $3
while read LINE
do
  LAST_NUMBER=`expr $LAST_NUMBER + 1`
  echo ">$LAST_NUMBER" >> $3
  echo $LINE >> $3
done < `grep -v '>' $2`
 
En relisant, je suis plus sur d'avoir compris l'exercice :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed