Erreur de déclaration awk if-then-else

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

  • vérifiez où vous fermez ce deuxième crochet: '{ if ( this is given) { do this } else { do that } }'

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

  1. Vous utilisez une comparaison dégalité au lieu dune affectation pour essayer et ajoutez le préfixe chr
  2. Vous avez mis ce qui devrait être une affectation entre crochets
  3. Il y a un après le premier
  4. Il ne doit pas y avoir de point-virgule avant la else partie
  5. 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/)

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *