rechercher et remplacer dans une séquence fasta

Je suis à la recherche d’une solution de revêtement pour rechercher et remplacer en utilisant le caractère sauvage ..

Consortingbution:

>sequence1 ATGCCAAACTGGAACT[A/T]ATTCAATGGCATGGACATAAATTC[A/C]ATACAATTACAAA >sequnce2 ATCAAACCGGTATGTACATT[A,T/G]ATTCATTACTA 

sortie:

 >sequence1 ATGCCAAACTGGAACTNATTCAATGGCATGGACATAAATTCNATACAATTACAAA >sequnce2 ATCAAACCGGTATGTACATTNATTCATTACTA 

Je dois tout remplacer par betwee “[” et “]” avec “N”. la longueur des données peut varier. J’ai pu trouver le modèle en utilisant le script awk mais je ne sais pas comment le remplacer. Aidez-moi, s’il vous plaît..

 awk -F'[][]' '{for(i=2;i<=NF;i=i+2) print $i}' 1.fasta 

Une autre chose que j’ai essayé est l’éditeur vi

 :%s/[.*\]/N/g 

en utilisant ci-dessus un, il remplace tout “[A / T] ATTCAATGGCATGGACATAAATTC [A / C]” à N

Essayez de faire ceci:

 perl -pe 's/\[.*?\]/N/g' file.txt 

EXPLICATIONS (à propos de regex)

  • s/// est le squelette de substitution de base (pour perl ou sed ): s/before/after/
  • s///g : le modificateur g à la fin, signifie toutes les occurrences
  • \[ : signifie: un littéral [ (ou autre chose à la place)
  • . : signifie: n’importe quel caractère
  • * signifie: 0 ou N caractère (s)
  • ? dire à la dernière regex d’être en mode pas gourmand

Cela dit, j’ai une autre solution amusante :

 perl -ne 'print join "N", split /\[.*?\]/;' file.txt 

Peut-être plus clair comme ça?! (mais toujours pareil)

 perl -ne ' print join( "N", split(/\[.*?\]/) ); ' file.txt 
 sed 's/\[[^]]*\]/N/g' file 

EDIT: explication comme demandé:

Recherchez un littéral “[” ([)> puis une séquence de zéro ou plusieurs non “]” caractères ([^]] *) suivis d’un littéral “]” ()) et remplacez cette chaîne par la lettre N. Faites-le “g” lobalement à travers chaque ligne.

il suffit d’append un autre liner. votre objective est la substitution, pas besoin de jouer avec $ x

 awk '{gsub(/\[[^\]]*\]/,"N")}1' file 

Cela fonctionne dans l’éditeur vi:

 %s/\[[^\]]*\]/N/g