Awk, condition sur un champ avec valeur numerique.
Résolu/Fermé
econdami
Messages postés
247
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
econdami - 26 mai 2014 à 14:47
A voir également:
- Awk, condition sur un champ avec valeur numerique.
- Excel cellule couleur si condition texte - Guide
- Pavé numérique bloqué - Guide
- Clavier numérique bloqué - Guide
- Faites afficher avec un fond coloré les cellules qui contiennent une valeur comprise entre 250 et 350. quel nombre est dessiné en surbrillance ? - Forum VB / VBA
- Quelles sont les 2 orientations possibles d'une page d’un document numérique ? ✓ - Forum Word
10 réponses
Utilisateur anonyme
23 mai 2014 à 17:19
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! ;)
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
econdami
Messages postés
247
Date d'inscription
mardi 8 avril 2008
Statut
Membre
Dernière intervention
24 mai 2014
24 mai 2014 à 09:07
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.
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.
dubcek
Messages postés
18758
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
24 décembre 2024
5 623
24 mai 2014 à 12:34
24 mai 2014 à 12:34
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
dubcek
Messages postés
18758
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
24 décembre 2024
5 623
26 mai 2014 à 12:14
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
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
:-(
dubcek
Messages postés
18758
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
24 décembre 2024
5 623
26 mai 2014 à 14:11
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"
}
}
dubcek
Messages postés
18758
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
24 décembre 2024
5 623
26 mai 2014 à 14:15
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"
}
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 :-)
dubcek
Messages postés
18758
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
24 décembre 2024
5 623
Modifié par dubcek le 26/05/2014 à 14:43
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