awk pour la boucle avec if else conditions de tableau
Je sollicite votre aide dans le stockage de awk retour des valeurs dans un tableau pour mon awk pour la boucle à l'aide de if else conditions.
If $3 == $7
then print $9 multiplied by $4
else print $4 multiplied by (2 minus $9)
J'ai eu ce travail jusqu'à présent par:
awk '{if ($3 == $7) print $9*$4; else print $4*(2-$9);}' file >outfile
le code ci-dessus fonctionne pour la première colonne de données ($9
). Cependant, je tiens à boucle sur toutes les colonnes de 9 à 1547 et retourne un tableau contenant les valeurs de retour. Cela devrait être assez simple, mais je ne peux pas l'air de comprendre certains concepts de base ici.
Jusqu'à présent, je comprends la nécessité de déclarer le nombre de boucles, avant la fonction, par:
awk ' {for(i=9;i<=NF;i++)} END {if ($3 == $7) print $i*$4; else print $4*(2-$i);}'
Cependant, comment et quand déclarer le tableau est au delà de moi (biologiste). Toute aide serait très appréciée.
Exemple:
d'entrée (gros fichier.. ici colonne de 1 à 10):
rs2070501 22 Un 0.0206 0.337855 rs2070501 G Un 0.977 0.066
de sortie:
0.0210738
ici l'instruction else coups de pied dans ($3 * (2-$9)
Comment obtenir awk pour imprimer le tableau 9-Nième, et pas seulement la colonne 9
Le
END
bloc est ce qui se passe lorsque toutes les lignes ont été lus. Voulez-vous dire quelque chose comme awk '{ for(i=9; i<=NF; ++i) printf "%s%i", (i==9 ? "" : " "), ($3 == $7 ? $i*$4 : $4*(2-$i)); printf "\n" }'
peut-être?votre code semble prometteur, mais ne renvoie que des "0" dans chaque cellule. Mais il a le bon nombre de colonnes.
Le
%i
code de mise en forme est pour les entiers; changer à %f
pour des flotteurs.exception en effet.. Toutes les lignes sont traitées, mais pas toutes les colonnes.
OriginalL'auteur MortenM | 2012-05-30
Vous devez vous connecter pour publier un commentaire.
Essayez avec cette.
La
( test ? when : else )
est juste une abréviation; les trucs après?
obtient évalué si le test est vrai, et les trucs après:
autrement. De sorte qu'il imprime un vide séparateur pour le premier champ, et un espace autrement; et choisit la façon de calculer la valeur du champ en fonction de si$3 == $7
est vrai.OriginalL'auteur tripleee