Awk, condition sur un champ avec valeur numerique.

Résolu/Fermé
econdami Messages postés 243 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 24 mai 2014 - Modifié par econdami le 23/05/2014 à 17:10
 econdami - 26 mai 2014 à 14:47
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,



A voir également:

10 réponses

Utilisateur anonyme
23 mai 2014 à 17:19
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 243 Date d'inscription mardi 8 avril 2008 Statut Membre Dernière intervention 24 mai 2014
24 mai 2014 à 09:07
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
24 mai 2014 à 12:34
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

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

Posez votre question
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
26 mai 2014 à 12:14
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
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
26 mai 2014 à 14:11
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
26 mai 2014 à 14:15
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
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 26/05/2014 à 14:43
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