Awk, condition sur un champ avec valeur numerique.
Résolu
econdami
Messages postés
247
Date d'inscription
Statut
Membre
Dernière intervention
-
econdami -
econdami -
Bonjour,
Je voudrait dans une commande awk faire une condition sur la valeur d'un champ si il est egal a 0.000. Un truc du style :
for (j=3; j<= NF; j++) {
if ($j == 0.000) {
print "NA";
Mais j'y arrive pas !!!! c'est jamais vrai. j'ai essaye "0.000" rien y fait !!!
Toute idee serait la bienvenue !!!
Bonne journee,
Je voudrait dans une commande awk faire une condition sur la valeur d'un champ si il est egal a 0.000. Un truc du style :
for (j=3; j<= NF; j++) {
if ($j == 0.000) {
print "NA";
Mais j'y arrive pas !!!! c'est jamais vrai. j'ai essaye "0.000" rien y fait !!!
Toute idee serait la bienvenue !!!
Bonne journee,
A voir également:
- Awk condition
- Excel cellule couleur si condition texte - Guide
- Excel condition ou - Guide
- Excel soustraction avec condition ✓ - Forum Excel
- Condition optimale téléphone ✓ - Forum Mobile
- Excel champ calculé avec condition - Forum Excel
10 réponses
salut,
on pourrait avoir un peu plus de contexte : un exemple d'entrée, la sortie correspondante, la commande complète.
nous sommes techniciens, pas devins! ;)
on pourrait avoir un peu plus de contexte : un exemple d'entrée, la sortie correspondante, la commande complète.
nous sommes techniciens, pas devins! ;)
awk '{for (j=3; j<= NF; j++){if ($j == "0.000")print j,$j,"NA"}}' <<< "_ _ _ 0 2 0.000 _ _ _"
6 0.000 NA
Bonjour,
Merci pour ta réponse.
Oui c'est vrai je ne rentre pas trop dans les détails. C'est toujours le dilemme entre en dire trop et risquer de décourager le lecteur potentiel et en dire pas assez et donc ne pas permettre une réponse éclairée.
Je n'ai pas le script sous la main (lundi je le retrouverai :-), mais l'idée est de traiter un fichier du type :
1 M 4.75 8.54 120.43 54.56 35.23 174.89
2 G 0.000 8.23 110.34 45.56 0.000 173.778
... etc. ...
En fonction du numéro du champ un calcul est réalisé et en sortie on obtiendra le même fichier avec le résultat des calculs, sauf dans le cas d'un champ en entrée égale à 0.000 ou on ne fera rien, juste mettre en sortie NA.
J'ai tenté une solution du type ce que tu proposes, sans succès (la sortie est comme si il n'y avait pas passage pas la condition). Bon lundi je poste le script et le fichier d'entrée ce sera plus efficace !
Merci pour ton aide.
Merci pour ta réponse.
Oui c'est vrai je ne rentre pas trop dans les détails. C'est toujours le dilemme entre en dire trop et risquer de décourager le lecteur potentiel et en dire pas assez et donc ne pas permettre une réponse éclairée.
Je n'ai pas le script sous la main (lundi je le retrouverai :-), mais l'idée est de traiter un fichier du type :
1 M 4.75 8.54 120.43 54.56 35.23 174.89
2 G 0.000 8.23 110.34 45.56 0.000 173.778
... etc. ...
En fonction du numéro du champ un calcul est réalisé et en sortie on obtiendra le même fichier avec le résultat des calculs, sauf dans le cas d'un champ en entrée égale à 0.000 ou on ne fera rien, juste mettre en sortie NA.
J'ai tenté une solution du type ce que tu proposes, sans succès (la sortie est comme si il n'y avait pas passage pas la condition). Bon lundi je poste le script et le fichier d'entrée ce sera plus efficace !
Merci pour ton aide.
hello
comme ça ?
comme ça ?
$ awk '{for (j=3; j<= NF; j++)if ($j == "0.000")$j="NA" ; print}' fichier
1 M 4.75 8.54 120.43 54.56 35.23 174.89
2 G NA 8.23 110.34 45.56 NA 173.778
Bonjour,
Bon maintenant cela change bien le resultat, mais que pour le 3eme champ !!!!:
%more test_2
1 M 0.000 0.000 0.000 0.000 0.000 0.000
2 G 0.000 8.426 110.028 44.988 0.000 174.164
3 R 0.000 8.263 120.551 55.872 29.826 176.980
4 G 0.000 8.482 109.847 44.835 0.000 173.901
5 R 0.000 8.157 120.688 55.771 29.981 176.336
% more essai
BEGIN {ORS=""}
FILENAME == ARGV[1] {
for (i=1;i<=NF;i++){
array[FNR,i]=$i
}
}
END {
for (j=1; j<= FNR; j++) {
print array[j,1]" "array[j,2]
for (i=3; i<= NF; i++) {
if ($i == "0.000") {
print " NA"}
else {
print " "array[j,i]}
}
print "\n"
}
}
% awk -f essai test_2
1 M NA 0.000 0.000 0.000 0.000 0.000
2 G NA 8.426 110.028 44.988 0.000 174.164
3 R NA 8.263 120.551 55.872 29.826 176.980
4 G NA 8.482 109.847 44.835 0.000 173.901
5 R NA 8.157 120.688 55.771 29.981 176.336
Il doit y avoir un truc evident, mais que je ne vois pas !!!!
Merci pour vos aides !!!
Bonne journee !
Bon maintenant cela change bien le resultat, mais que pour le 3eme champ !!!!:
%more test_2
1 M 0.000 0.000 0.000 0.000 0.000 0.000
2 G 0.000 8.426 110.028 44.988 0.000 174.164
3 R 0.000 8.263 120.551 55.872 29.826 176.980
4 G 0.000 8.482 109.847 44.835 0.000 173.901
5 R 0.000 8.157 120.688 55.771 29.981 176.336
% more essai
BEGIN {ORS=""}
FILENAME == ARGV[1] {
for (i=1;i<=NF;i++){
array[FNR,i]=$i
}
}
END {
for (j=1; j<= FNR; j++) {
print array[j,1]" "array[j,2]
for (i=3; i<= NF; i++) {
if ($i == "0.000") {
print " NA"}
else {
print " "array[j,i]}
}
print "\n"
}
}
% awk -f essai test_2
1 M NA 0.000 0.000 0.000 0.000 0.000
2 G NA 8.426 110.028 44.988 0.000 174.164
3 R NA 8.263 120.551 55.872 29.826 176.980
4 G NA 8.482 109.847 44.835 0.000 173.901
5 R NA 8.157 120.688 55.771 29.981 176.336
Il doit y avoir un truc evident, mais que je ne vois pas !!!!
Merci pour vos aides !!!
Bonne journee !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
comme ça ?
$ awk '{for (j=3; j<= NF; j++)if ($j == "0.000")$j="NA" ; print}' fichier
1 M NA NA NA NA NA NA
2 G NA 8.426 110.028 44.988 NA 174.164
3 R NA 8.263 120.551 55.872 29.826 176.980
4 G NA 8.482 109.847 44.835 NA 173.901
5 R NA 8.157 120.688 55.771 29.981 176.336
Merci pour ton aide dubcek, mais cette partie doit s'inserer dan sun plus gros script ou (je crois) avoir besoin de la stucture if else. Je peux te montrer ce plus gros script, mais la partie clef est ce passage. Ton exemple marche tres bien si on veut seulement changer 0.000 par NA. Dans mon cas je dois m'emmeler les crayons avec les {} enfin je crois et comme j'ai le nez sur le script je ne vois pas l'erreur !!!
nouvel essai en prenant exemple sur ta commande :
% more essai
BEGIN {ORS=""}
FILENAME == ARGV[1] {
for (i=1;i<=NF;i++){
array[FNR,i]=$i
}
}
END {
for (j=1; j<= FNR; j++) {
print array[j,1]" "array[j,2]
for (i=3; i<= NF; i++) {
if ($i == "0.000") {
$i=" NA"; print $i }
else {
print " "array[j,i] }
}
print "\n"
}
}
% more test_2
1 M 0.000 0.000 0.000 0.000 0.000 0.000
2 G 0.000 8.426 110.028 44.988 0.000 174.164
3 R 0.000 8.263 120.551 55.872 29.826 176.980
4 G 0.000 8.482 109.847 44.835 0.000 173.901
5 R 0.000 8.157 120.688 55.771 29.981 176.336
% awk -f essai test_2
1 M NA 0.000 0.000 0.000 0.000 0.000
2 G 0.000 8.426 110.028 44.988 0.000 174.164
3 R 0.000 8.263 120.551 55.872 29.826 176.980
4 G 0.000 8.482 109.847 44.835 0.000 173.901
5 R 0.000 8.157 120.688 55.771 29.981 176.336
:-(
nouvel essai en prenant exemple sur ta commande :
% more essai
BEGIN {ORS=""}
FILENAME == ARGV[1] {
for (i=1;i<=NF;i++){
array[FNR,i]=$i
}
}
END {
for (j=1; j<= FNR; j++) {
print array[j,1]" "array[j,2]
for (i=3; i<= NF; i++) {
if ($i == "0.000") {
$i=" NA"; print $i }
else {
print " "array[j,i] }
}
print "\n"
}
}
% more test_2
1 M 0.000 0.000 0.000 0.000 0.000 0.000
2 G 0.000 8.426 110.028 44.988 0.000 174.164
3 R 0.000 8.263 120.551 55.872 29.826 176.980
4 G 0.000 8.482 109.847 44.835 0.000 173.901
5 R 0.000 8.157 120.688 55.771 29.981 176.336
% awk -f essai test_2
1 M NA 0.000 0.000 0.000 0.000 0.000
2 G 0.000 8.426 110.028 44.988 0.000 174.164
3 R 0.000 8.263 120.551 55.872 29.826 176.980
4 G 0.000 8.482 109.847 44.835 0.000 173.901
5 R 0.000 8.157 120.688 55.771 29.981 176.336
:-(
essayer
...
for (j=1; j<= FNR; j++) {
print array[j,1]" "array[j,2]
for (i=3; i<= NF; i++) {
if (array[j, i] == "0.000") {
print array[j, i]=" NA" }
else {
print " "array[j,i] }
}
print "\n"
}
}
cool ca marche (je n'ai tetste que la premiere methode )!!!!
En revanche je comprends pas pourquoi il faut passer par le tableau (array[j,i]) plutot que la definition classique du champ ($i) !!!
Bon je courts appliquer cela dans le plus gros script !!!
Merci beaucoup :-)
En revanche je comprends pas pourquoi il faut passer par le tableau (array[j,i]) plutot que la definition classique du champ ($i) !!!
Bon je courts appliquer cela dans le plus gros script !!!
Merci beaucoup :-)