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

Linux Discussion :

[AWK] Substitution de chaine


Sujet :

Linux

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 6
    Par défaut [AWK] Substitution de chaine
    Bonjour,

    Je souhaiterai substituer une valeur prédéfinie d'un fichier de la facon suivante :

    Fichier test.txt :

    A;-99999;X;X;X
    B;-99999;X;X;X
    C;-99999;X;X;X
    D;-99999;X;X;X
    E;-99999;X;X;X

    J'utilise le script shell suivant :

    ID="3834690"

    awk -v PARAM=$ID '
    {
    gsub(-99999,PARAM, $0);
    PARAM ++;
    print $0;
    } ' test.txt > ./result.txt


    Ca ne marche pas ca me donne le resultat suivant :

    A;3.83469e+06;X;X;X
    B;3.83469e+06;X;X;X
    C;3.83469e+06;X;X;X
    D;3.83469e+06;X;X;X
    E;3.83469e+06;X;X;X

    J'aurai voulu avoir :

    A;3834690;X;X;X
    B;3834691;X;X;X
    C;3834692;X;X;X
    D;3834693;X;X;X
    E;3834694;X;X;X

    En fait il me convertit ma variable selon le CONVFMT qui est "%.6g"
    et j'arrive pas a m'en affranchir

    Auriez-vous une idée ?

    D'avance merci de votre aide

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 27
    Par défaut
    oui c'est simple il faut juste mettre -9999 entre "" pour que cela soit pris pour une chaine de car.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ID="3834690"
     
    awk -v PARAM=$ID '
    {
    gsub("-99999",PARAM, $0);
    PARAM ++;
    print $0;
    } ' test.txt > ./result.txt

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 6
    Par défaut
    J'ai malheureusement déjà testé cette solution et ça ne
    fonctionne pas plus. En fait, mon identifiant ($ID) est
    automatiquement reformaté avec un format incluant
    un exposant et c'est pas du tout ce que je veux. J'arrive
    pas a garder l'écriture initiale (3834690)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 27
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
     cat test.txt
    A;-99999;X;X;X
    B;-99999;X;X;X
    C;-99999;X;X;X
    D;-99999;X;X;X
     
     cat ma.sh  
    ID="3834690"
     
    awk -v PARAM=$ID '
    {
    gsub(-99999,PARAM, $0);
    PARAM ++;
    print $0;
    } ' test.txt > ./result.txt
     
     ./ma.sh 
     
     cat result.txt 
    A;3834690;X;X;X
    B;3834691;X;X;X
    C;3834692;X;X;X
    D;3834693;X;X;X
    E;3834694;X;X;X
    oui c'est marrant car ,en fait meme ta premiere version marche chez .
    avec bash et GNU Awk 3.1.5

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 6
    Par défaut
    Je suis sous ksh et bizarrement ça fonctionne
    pas non plus en sh arffff

    Personne ne connait une autre façon de faire
    tout aussi rapide que AWK ?

  6. #6
    Membre émérite Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Par défaut
    [QUOTE=MarLOne]Je suis sous ksh et bizarrement ça fonctionne
    pas non plus en sh arffff
    QUOTE]


    Peut-être comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    awk -v PARAM=$ID  '
    BEGIN {
    	FS=";"
    	OFS=";"
    }
    {
    	$2=PARAM
    	PARAM++
    	print $0
    } ' toto.txt

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 6
    Par défaut
    Bonjour,

    Tout d'abord merci de ton aide

    Malheureusement ça ne marche pas plus. Ce
    que je comprends de ton script c'est que tu
    redéfinis le séparateur d'entrée et de sortie
    mais ça ne solutionne pas le problème de
    conversion de ma variable en un format flottant
    comportant un exposant

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 27
    Par défaut
    je ne compred pas pourquoi cela ne marche pas chez toi ,j'ai fait le test avc ksh ,et ca marche aussi , enfin au pire tu peux utiliser du shell avec read line mais je ne sait pas si cela seras aussi rapide .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ID="3834690"
    MOTIF="-99999"
     
    cat test.txt | while read  line;
    do
    	echo ${line//$MOTIF/$ID} 
    	let ID=ID+1
     
    done >> result.txt

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 6
    Par défaut
    Effectivement ton script fonctionne et j'ai aussi
    trouvé une autre écriture AWK

    ID=3834690

    awk -v PARAM=$ID '
    {
    pos=match($0, "-99999");
    debut=substr($0,1,pos-1);
    fin=substr($0,pos+6);
    printf "%s%d%s\n",debut,PARAM,fin;
    PARAM++;
    }' test.txt

    et ça marche

    Merci a tous de votre aide

  10. #10
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 6
    Par défaut
    Mieux encore

    ID=3834690

    awk -v PARAM=$ID '{PARAM=sprintf("%.0d",PARAM);sub(-99999,PARAM,$0);PARAM++;print $0}' test.txt

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

Discussions similaires

  1. Substitution de chaines
    Par oliviernouhi dans le forum Langage
    Réponses: 2
    Dernier message: 10/07/2012, 16h14
  2. Substitution de chaine
    Par Rochester dans le forum Langage
    Réponses: 4
    Dernier message: 08/08/2011, 16h05
  3. Réponses: 2
    Dernier message: 13/11/2010, 10h30
  4. FOR /F, FINDSTR, variable temporaire, et substitution de chaine
    Par abdelhamidem dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 09/03/2009, 11h35
  5. Substitution de chaine de caractères
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 13/09/2005, 14h01

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