Awk, condition sur un champ avec valeur numerique.

Résolu/Fermé
Signaler
Messages postés
243
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
24 mai 2014
-
 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,



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! ;)
awk '{for (j=3; j<= NF; j++){if ($j == "0.000")print j,$j,"NA"}}' <<< "_ _ _ 0 2 0.000 _ _ _"
6 0.000 NA
0
Messages postés
243
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
24 mai 2014

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.
0
Messages postés
18402
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
15 janvier 2022
5 526
hello
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
0
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 !
0
Messages postés
18402
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
15 janvier 2022
5 526
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
0
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

:-(
0
Messages postés
18402
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
15 janvier 2022
5 526
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"
}
}
0
Messages postés
18402
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
15 janvier 2022
5 526
ou
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") {
array[j, i]="NA" }
print " "array[j,i]
}

print "\n"
}
0
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 :-)
0
Messages postés
18402
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
15 janvier 2022
5 526
il n'y a pas besoin de tableau, la ligne est comme un tableau, $i == champ i
for (j=3; j<= NF; j++)
if ($j == "0.000")$j="NA"
print $0
0
Cool le gros script marche aussi !!!!
Merci pour tes suggestions tres pertinentes !!!
Bonne soiree,
0