IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Utilisation du if dans le awk


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 81
    Par défaut Utilisation du if dans le awk
    Bonjour,

    J'utilise un if dans une commande awk pour comparer 2 variables. Ces dernières contiennent 30 caractères mais le if ne compare que les 20 premiers qui sont identiques (en l'occurence que des 0). Du coup, l'égalité est respectée alors que ça ne devrait pas être le cas.
    Quelqu'un à une idée du pourquoi seulement les 20 premiers caractères sont testés? Est ce une valeur par défaut par exemple?

    Merci d'avance.

  2. #2
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonjour.

    Pourrait-tu nous montrer la commande en question ? Sinon on risque pas de savoir la raison de ton dysfonctionnement (d'autant plus qu'en ce moment, ma boule de cristal est en réparation)...

    Exemple de comparaison qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [idriss@hp-dv6]:~$ echo "VoiciUnePhraseDePlusDe30Carracteres;VoiciUneAutrePhraseDePlusDe30Carracteres" | awk -F ';' '($1 == $2){print "OK"}'
    [idriss@hp-dv6]:~$ echo "VoiciUnePhraseDePlusDe30Carracteres;VoiciUnePhraseDePlusDe30Carracteres" | awk -F ';' '($1 == $2){print "OK"}'
    OK
    [idriss@hp-dv6]:~$ echo "VoiciUnePhraseDePlusDe30Carracteres1;VoiciUnePhraseDePlusDe30Carracteres2" | awk -F ';' '($1 == $2){print "OK"}'
    [idriss@hp-dv6]:~$
    Cordialement,
    Idriss

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 81
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    awk 'BEGIN {FS=";"; OFS=";"}
    	        {tabClientId [NR] = $2;
    	     	}
    			END { 	
    				varDataLigne="0";varLastDoubles="";
    			   	for ( i = 1 ; i <= NR ; i++ ) {
    				  	if (tabClientId[i] == varDataLigne && tabClientId[i] != varLastDoubles){
    				  		# Pour ecrire les autres lignes en doublon
    				  		print tabClientId[i];
    				  		varLastDoubles=tabClientId[i];
    				  	}
    					varDataLigne=tabClientId[i];
    			    }
    			} ' $FILE_NAME_TMP>$FILE_NAME_TMP2
    avec dans le fichier FILE_NAME_TMP les lignes suivantes
    ;000100000000000000000000000054;TOTO
    ;000100000000000000000000000055;TATA

    J'ai remarqué que la valeur tabClientId [NR] est par défaut considéré comme du numérique. Hors je ne sais pas si ça vient de mon environnement mais seul les 20 premiers caractères affectés à cette variable sont utilisés dans mon if (tabClientId[i] == varDataLigne...
    Lorsque l'on utilise ce même if avec des valeurs alpha-numériques, les 30 caractères sont bien comparés...

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Bonjour,

    On devine que tu veux imprimer les lignes en doublons. Si c'est bien le cas, ton code est un peu bizarre. Ta boucle sur la variable en END pourrait très bien se faire en première lecture séquentielle. Une piste possible:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'd[$2]{print}{d[$2]=1}' FS=";" OFS=";" fichier

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 81
    Par défaut
    Merci ripat, la commande que tu as indiqué marche correctement.
    Pourrais tu me l'expliquer stp car je séche...

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    d[$2]{print} # si l'indice $2 du tableau d != 0 ---> print ( chaque indice du tableau d a la valeur 0 par défaut)
     
    {d[$2]=1} # pour chaque ligne, création de d[$2] (avec valeur arbitraire de 1)
    Si tu imprimes toute la ligne, tu n'as même pas besoin de définir OFS:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'd[$2]{print}{d[$2]=1}' FS=";" fichier

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation d'une expression régulière dans un AWK
    Par Nattiz dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 27/08/2013, 21h08
  2. Réponses: 1
    Dernier message: 21/07/2011, 09h49
  3. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  4. impossible d'utiliser ma fonction dans un insert
    Par caramel dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/04/2003, 15h04
  5. Utilisation de Pointeurs dans API windows
    Par Drooxy dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 13/03/2003, 22h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo