Jécris une instruction if-then-else en utilisant awk dans un script bash.
Ce que je voudrais faire, cest identifier les lignes avec des valeurs col 1 ne correspondant pas à une chaîne particulière (rs ou chr) et ajouter un préfixe (chr) aux valeurs col 1 pour ces lignes identifiées. Toutes les lignes avec la chaîne correspondante doivent être imprimées telles quelles – sans ajout.
Ma ligne de code jusquà présent est:
awk "{if (! ($1 ~ /rs/ || $1 ~ /chr/)) {($1 == "chr"$1); print $0}}; else {print $0}" filename > newfilename
I continue de recevoir des messages derreur de syntaxe avec ce code.
Je peux effectuer lidentification et lajout avec succès tout seul mais jai des problèmes pour les combiner en une seule commande.
Commentaires
Réponse
Voici votre code, développé pour la visibilité:
awk " { if (! ($1 ~ /rs/ || $1 ~ /chr/) ) { ($1 == "chr"$1); print $0} }; else { print $0 } " filename > newfilename
Il y a un certain nombre de problèmes avec cela qui me viennent à lesprit
- Vous utilisez une comparaison dégalité au lieu dune affectation pour essayer et ajoutez le préfixe
chr
- Vous avez mis ce qui devrait être une affectation entre crochets
- Il y a un après le premier
- Il ne doit pas y avoir de point-virgule avant la
else
partie - Il vous manque la fermeture finale
}
après le code
Voici une version fixe, encore développée:
awk " { if (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1; print $0 } else { print $0 } } " filename > newfilename
Et puis nous pouvons voir une optimisation simple pour déplacer les print $0
répétés en dehors de votre condition:
awk " { if (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1 } print $0 } " filename > newfilename
Depuis il sagit essentiellement dune simple « condition → modifier », vous pouvez en fait utiliser la structure standard de awk
« pour simplifier encore davantage cela. Ici, nous avons deux instructions awk
, traitées séquentiellement pour chaque ligne de votre fichier dentrée. Les préfixes de première ligne "chr"
si nécessaire. Le second imprime chaque ligne.
awk " (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1 } 1 " filename > newfilename
Comme il sagit de awk
, il peut même être regroupé en une seule ligne , bien que la lisibilité en souffre un peu
awk "(! ($1 ~ /rs|chr/) ) { $1 = "chr" $1 } 1" filename > newfilename
Answer
Lutilisation de cette ligne semble fonctionne parfaitement:
awk "!($1 ~ /rs/ || /chr/) {$1="chr"$1}1"
Commentaires
-
($1 ~ /rs/ || /chr/)
correspondra à$1
pour"rs"
, mais$0
pour"chr"
. Vous devez soit($1 ~ /rs/ || $1 ~ /chr/)
, soit($1 ~ /rs|chr/)
'{ if ( this is given) { do this } else { do that } }'