Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications
Applications Questions sur l'utilisation d'applications, du shell, et des interfaces graphiques (KDE, Gnome, XFCE... )
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/03/2011, 17h48   #1
Invité régulier
 
Inscription : janvier 2009
Messages : 12
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 12
Points : 5
Points : 5
Par défaut awk et les opérateurs < et >

bonjour,

je suis confronté à un problème qui me dépasse complètement
si je fais tourner cette commande:
Code :
gawk '{ if ($2 == %y2%) print $1,$2}' coord2.txt > coord4.txt
avec %y2% une variable définie précédemment telle que y2=46 (par ex.)
(je fais tourner mes commandes awk dans un fichier batch. par forcément très joli mais je ne sais pas faire autrement pour de tels scripts)

j'ai bien en sortie un fichier avec une seule ligne
si je le fais avec:
Code :
gawk '{ if ($2 != %y2%) print $1,$2}' coord2.txt > coord4.txt
j'ai en sortie un fichier avec (n-1) lignes

mais si je le fais avec:
Code :
gawk '{ if ($2 <= %y2%) print $1,$2}' coord2.txt > coord4.txt
ou
Code :
gawk '{ if ($2 >= %y2%) print $1,$2}' coord2.txt > coord4.txt
ou
Code :
gawk '{ if ($2 < %y2%) print $1,$2}' coord2.txt > coord4.txt
ou
Code :
gawk '{ if ($2 > %y2%) print $1,$2}' coord2.txt > coord4.txt
alors ça ne marche pas du tout. tout se passe comme si Cygwin ne reconnait pas les signes < ou >. car il m'affiche la ligne suivante à l'exécution:
Code :
gawk '{ if ($2 print $1,$2}' coord2.txt > coord4.txt
quelqu'un a une idée?
merci d'avance
seb
seb.garcia est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 29/03/2011, 15h02   #2
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Aucune idée du pourquoi du comment, visiblement un problème d'interprétation sous Cygwin... ça marche évidemment bien sous Linux

Si tu n'as que des nombres positifs, tu peux éventuellement contourner avec une formulation du genre :
Code :
gawk '{ if (int($2 / %y2%)) print $1,$2}' coord2.txt > coord4.txt
int($2 / %y2%) valant 0 (donc faux) si $2 < %y2% et un nombre positif (donc vrai) si $2 >= %y2%
à adapter en fonction du besoin :
int(%y2% / $2) donne le résultat inverse (attention au zéro)
int(($2-1) / %y2% correspond si $2 > %y2% cette fois (avec des nombres entiers)
etc...

C'est un peu du bricolage mais bon
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/03/2011, 15h32   #3
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153


awk ne connaît pas y2, si cette variable est définie dans l'interpréteur courant; il faut utiliser l'option -v de gawk.

Je n'ai pas de CygWin, mais en gros :
Code interpréteur GNU/linux :
1
2
3
4
5
$ y2=42
$ gawk 'BEGIN{print y2}'
 
$ gawk -v awkVar="$y2" 'BEGIN{print awkVar}'
42
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 29/03/2011, 16h01   #4
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Citation:
Envoyé par N_BaH Voir le message


awk ne connaît pas y2, si cette variable est définie dans l'interpréteur courant; il faut utiliser l'option -v de gawk.

Je n'ai pas de CygWin, mais en gros :
Code interpréteur GNU/linux :
1
2
3
4
5
$ y2=42
$ gawk 'BEGIN{print y2}'
 
$ gawk -v awkVar="$y2" 'BEGIN{print awkVar}'
42
D'après son post, il utilise un fichier batch et %y2% ressemble d'ailleurs beaucoup à une variable DOS... De plus, cela semble marcher avec "==" mais pas avec "<" ou ">"... donc je ne pense pas que le problème vienne de ça.

Exemple avec gawk pour windows (sans Cygwin donc) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
P:\>more test.bat
@echo off
set y2=42
gawk "{if ($1 < %y2%) print \"ok\"}"
 
P:\>test.bat
41
ok
42
43
0
ok
15
ok
Terminer le programme de commandes (O/N)*? o
Ce qui est d'ailleurs étonnant, c'est que ça fonctionne mieux sous Windows que sous Cygwin... alors que c'est souvent galère pour gérer les caractères sous Windows...
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/03/2011, 17h38   #5
Invité régulier
 
Inscription : janvier 2009
Messages : 12
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 12
Points : 5
Points : 5
Merci Alek-C! ca marche en passant avec "int"!
je pense aussi que c'est un problème d'interprétation par Cygwin d'une commande awk dans un fichier batch. mais je ne sais pas encore comment faire autrement. un jour...
seb.garcia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2011, 17h44   #6
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
En évitant de passer par Cygwin ? Il existe un port de awk (et d'autres outils gnu) pour windows qui marche très bien :
http://gnuwin32.sourceforge.net/
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h57.


 
 
 
 
Partenaires

Hébergement Web