Awk, condition sur un champ avec valeur numerique.

Résolu
econdami Messages postés 247 Date d'inscription   Statut Membre Dernière intervention   -  
 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

Utilisateur anonyme
 
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
econdami Messages postés 247 Date d'inscription   Statut Membre Dernière intervention  
 
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
econdami
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
econdami
 
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
econdami
 
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
econdami
 
Cool le gros script marche aussi !!!!
Merci pour tes suggestions tres pertinentes !!!
Bonne soiree,
0