Je veux changer tous les Exemple de fichier: 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: Donc, après avoir créé mon fichiers de séquence avec lesquels j'ai essayé de continuer mon script: 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. 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
>Name_with_nnn
---ATGC---ATTTG
>Name2_with_nnn
ATGGG----GGT---
4 Réponses :
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
.
Vous pouvez utiliser ce simple gnu sed
:
>Name_with_nnn ---ATGC---ATTTG >Name2_with_nnn ATGGG----GGT---
sed '/^>/!{s/n/-/g; s/.*/\U&/;}' file
Vous pouvez résoudre ce problème avec Et votre sortie serait: sed
a> avec la ligne ci-dessous: >Name_with_nnn
---ATGC---ATTTG
>Name2_with_nnn
ATGGG----GGT---
sed -i "/^>/! {s/n/-/g; s/\(.*\)/\U\1/g}" text.txt
@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.
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.