Commande bash awk, comment mettre en variables.

Résolu/Fermé
Jeremyprog - Modifié le 4 janv. 2022 à 13:25
 Jeremyprog - 4 janv. 2022 à 18:03
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

mamiemando Messages postés 33553 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 mars 2025 7 830
Modifié le 4 janv. 2022 à 13:43
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
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
dubcek Messages postés 18767 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 5 mars 2025 5 628
4 janv. 2022 à 16:08
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
Je bûche dessus depuis 3jours... tu es trop fort ta commande fonctionne MERCI d'avoir pris du temps pour moi:)
MERCI
0