2
votes

Comment remplacer des lettres dans des lignes dans un fichier fasta en utilisant des boucles bash?

Je veux changer tous les n de la séquence en - , mais je ne sais pas comment faire en sorte que mon script bash ne change pas le n code> qui apparaît dans les noms de séquence. Je n'ai pas d'expérience avec sed ou regex pour m'assurer que mon script bash ne lit que les lignes qui ne commencent pas par > , car cela indique l'en-tête.

Exemple de fichier:

XXX

En même temps, je veux convertir toutes les lettres minuscules en majuscules, uniquement dans les lignes de séquence. Je ne sais même pas comment commencer à utiliser sed, je trouve cela très difficile à comprendre.

Résultat attendu:

while IFS= read -r line
do
     if [[ $line == ">"* ]]
     then
          echo "Ignoring header line: $line"
     else
          echo "Converting to uppercase and then N-to-gaps"
          # sed or tr?? do call $line or do I call $OUTFILE? so confused..
     fi
done      

Donc, après avoir créé mon fichiers de séquence avec lesquels j'ai essayé de continuer mon script:

>Name_with_nnn
---ATGC---ATTTG
>Name2_with_nnn
ATGGG----GGT---


0 commentaires

4 Réponses :


0
votes

Que diriez-vous de awk ?

sed -E '/^>/!{s/n/-/g;s/(.*)/\U\1/g;}' data

Résultat:

sed -E '/^[^>]/{s/n/-/g;s/(.*)/\U\1/g;}' data

Cependant, sed code> peut le faire aussi (GNU sed):

>Name_with_nnn
---ATGC---ATTTG
>Name2_with_nnn
ATGGG----GGT---

C'est la même chose que:

awk '/^[^>]/{gsub("n","-");print toupper($0);next;}1' data

Si vous voulez changer en place, vous pouvez ajouter le commutateur -i à sed.


0 commentaires

2
votes

Vous pouvez utiliser ce simple gnu sed :

>Name_with_nnn
---ATGC---ATTTG
>Name2_with_nnn
ATGGG----GGT---

sed '/^>/!{s/n/-/g; s/.*/\U&/;}' file


0 commentaires

2
votes

3 commentaires

@DNAngel sachez que j'ai mis à jour le script car la conversion en majuscules était manquante.


@CedricZoppolo Non seulement en majuscules, vous avez également mis à jour start with > , cela vaut peut-être la peine d'être mentionné.


@Tiw a raison. J'ai également mis à jour pour m'assurer que seules les lignes ne commençant pas par > seront converties. Il me manquait le caractère ^ pour obtenir les lignes commençant par > et non les lignes contenant ce caractère dans une partie de la ligne.



2
votes

En pur Bash, probablement assez lent pour des entrées plus importantes:

while IFS= read -r line; do
    case $line in
        '>'*)
            printf '%s\n' "$line"
            ;;
        *)
            line=${line//n/-}
            printf '%s\n' "${line^^}"
            ;;
    esac
done < infile

Cela utilise un instruction case avec correspondance de motif pour tester si une ligne commence par > ou non; pour modifier les lignes, extensions de paramètres sont utilisé. L'extension $ { paramètre ^^} nécessite Bash 4.0 ou plus récent.


0 commentaires