Commande bash awk, comment mettre en variables.

Résolu
Jeremyprog -  
 Jeremyprog -
Bonjour,
J'ai un petit souci sûrement tout bête mais je n'arrive pas à le régler.
J'ai fais un petit script en
bash
avec la commande
awk
.

awk '$0=$0"lulu"'


Ça fonctionne très bien mais je voudrais remplacer
"lulu"
par une variable du genre

var ="toto"
awk '$0=$0''#var' 


... mais cela ne fonctionne pas, j'ai lu toute la doc sur
awk
et j'ai du rater un truc je n'arrive pas à trouver
Si quelqu'un a un piste, ça serait super gentil :)

Merci de prendre du temps pour moi:)

2 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Bonjour,

    Pour déclarer une variable en shell, il ne faut pas mettre d'espace autour de l'opérateur
    =
    :

    var="toto"
    echo $var # Affiche toto


    En général, pour injecter le contenu d'une variable shell dans une commande shell, tu peux utiliser l'opérateur
    ${var}
    (en abrégé
    $var
    ). Mais ici, c'est plus compliqué, car en fait on veut injecter une variable shell dans un code awk et du coup
    $
    n'a pas le même sens partout. On pourrait éventuellement s'en sortir avec des
    eval
    et en échappant les
    $
    mais ce serait assez illisible et pénible à écrire.

    Heureusement,
    awk
    permet de récupérer facilement une variable shell et de l'injecter dans les instructions passées à
    awk
    , comme le montre cet exemple :

    var="/webroot"
    echo | awk -v r=$root '{ print "shell variable $root value is " r}'


    Après, je ne connais pas le contexte de ta question, mais si le but est juste de concaténer une saisie avec une chaîne, je ne vois pas trop l'utilité de
    awk
    . Tu peux directement écrire un petit script shell :

    toto.sh

    #!/bin/bash
    read saisie
    echo $1$saisie
    


    Exécution :

    (mando@silk) (~) $ chmod a+x toto.sh
    (mando@silk) (~) $ ./toto.sh toto
    tata
    tototata


    Bonne chance
    1
    1. Jeremyprog
       
      Merci pour ta réponse rapide et très complète.

      J'ai un fichier
      fichier.txt
      contenant :
      ab
      cd
      ef
      gh


      Quand je mets la commande :
      awk '$0=$0"lulu"' /chemin/fichier.txt


      J'obtiens :
      ablulu
      bclulu
      eflulu


      C'est ce que je voulais, mais à la place de
      lulu
      je veux mettre une variable. Donc je mets :

      var=`sed -n '1p' /chemin/fichier2.txt`

      (La première ligne du
      fichier2.txt
      est bien stocké dans la variable
      var
      ).

      Mais
      awk '$0=$0$variable/chemin/fichier.txt
      cela ne fonctionne pas, j'ai essayé avec plusieurs syntaxe mais ça bloque la variable n'est pas lu comme une variable :(
      0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    hello
    $ var="lulu"
    $ awk -v x="$var" '$0=$0 x' fichier.txt
    ablulu
    cdlulu
    eflulu
    ghlulu
    $ var="lolo"
    $ awk -v x="$var" '$0=$0 x' fichier.txt
    ablolo
    cdlolo
    eflolo
    ghlolo
    $
    1
    1. Jeremyprog
       
      Je bûche dessus depuis 3jours... tu es trop fort ta commande fonctionne MERCI d'avoir pris du temps pour moi:)
      MERCI
      0