Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1327 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Help] Sed & Expressions Régulières

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Help] Sed & Expressions Régulières

n°2057119
axilatis
Posté le 15-02-2011 à 20:49:15  profilanswer
 

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

mood
Publicité
Posté le 15-02-2011 à 20:49:15  profilanswer
 

n°2057140
gilou
Modérateur
Modzilla
Posté le 15-02-2011 à 21:56:30  profilanswer
 

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é!  --
n°2057141
bentan
39éme mobiles... Addict !?
Posté le 15-02-2011 à 21:58:50  profilanswer
 

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 :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Help] Sed & Expressions Régulières

 

Sujets relatifs
[PHP-RegEx] Remplacer des expressions par des caractèresSed, remplacer les n premières occurrences
[help] C# - API NetWORKSSession/Cookie fonctionnent qu'avec Firefox HELP
[vbs] Help- Connexion à une base de donnée SQLFaire fonctionner ZendDebugger sous eclipse , help !
Help pour une requete 
Plus de sujets relatifs à : [Help] Sed & Expressions Régulières


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR