SED: si condition 3eme champ alors ajout en fin de ligne

Résolu
bob737 Messages postés 157 Statut Membre -  
jivef Messages postés 1024 Statut Membre -
Bonjour,

J'ai un fichier fic.txt avec :

champ1;champ2; TOTO; champ4;
champ1;champ2; TITI; champ4;

Je voudrais ajouter en fin de ligne OK si dans ce fichier, je trouve TOTO sur le 3ème champ.

J'essaie avec sed mais je galère.
J'ai juste trouvé le cas où la ligne "contient" la chaine TOTO (ci-dessous) mais je voudrais restreindre la condition au 3ème champ.
NODE=TOTO
STATUT=OK
sed -e "s/^\(.*${NODE}*\).*$/&${STATUT}/g" fic.txt

Merci de votre aide.

6 réponses

zipe31 Messages postés 38797 Statut Contributeur 6 433
 
Salut,

$ cat fich 
champ1;champ2; TOTO; champ4;
champ1;champ2; TITI; champ4;

$ sed 's/^[^;]*;[^;]*; TOTO;.*/& OK/' fich
champ1;champ2; TOTO; champ4; OK
champ1;champ2; TITI; champ4;

0
dubcek Messages postés 19021 Statut Contributeur 5 637
 
hello
$ NODE=TOTO; STATUS=OK
$ awk -F ";" -v n=$NODE -v s=$STATUS '$3 ~ n {$0=$0 s} {print}' fic.txt
champ1;champ2; TOTO; champ4;OK
champ1;champ2; TITI; champ4;
0
bob737 Messages postés 157 Statut Membre
 
whoaa! super merci pour vos réponses rapides! ça marche.

Et maintenant si je veux encore restreinte la condition en utilisant plus 'contient' TOTO sur le 3ème champ mais =TOTO sur le 3eme champ?

Merci.
0
dubcek Messages postés 19021 Statut Contributeur 5 637
 
avec des espaces dans le champ 3
$ cat fic.txt
champ1;champ2; TOTO11; champ4;
champ1;champ2; 22TOTO; champ4;
champ1;champ2; TOTO; champ4;
champ1;champ2; TITI; champ4;
$ awk -F ";" -v n=$NODE -v s=$STATUS '$3 ~ "^[ ]*" n "[ ]*$" {$0=$0 s} {print}' fic.txt
champ1;champ2; TOTO11; champ4;
champ1;champ2; 22TOTO; champ4;
champ1;champ2; TOTO; champ4;OK
champ1;champ2; TITI; champ4;
0
bob737 Messages postés 157 Statut Membre
 
Merci!
0
bob737 Messages postés 157 Statut Membre
 
oups...je n'ai pas d'espace dans le 3eme champ.
0
dubcek Messages postés 19021 Statut Contributeur 5 637
 
ca ne gène pas
$ cat fic.txt
champ1;champ2; TOTO11; champ4;
champ1;champ2; 22TOTO; champ4;
champ1;champ2;TOTO; champ4;
champ1;champ2; TOTO; champ4;
champ1;champ2; TITI; champ4;
$ NODE=TOTO; STATUS=OK; awk -F ";" -v n=$NODE -v s=$STATUS '$3 ~ "^[ ]*" n "[ ]*$" {$0=$0 s} {print}' fic.txt
champ1;champ2; TOTO11; champ4;
champ1;champ2; 22TOTO; champ4;
champ1;champ2;TOTO; champ4;OK
champ1;champ2; TOTO; champ4;OK
champ1;champ2; TITI; champ4;
$
0
bob737 Messages postés 157 Statut Membre
 
J'ajoute une difficulté:

Peut-on chaîner deux awk comme avec un pipe soit
j'ajoute à la condition précédente l'action de remplacer le TOTO par STATUS sur le 3eme champ

J'ai réussi avec deux commandes awk mais je me demande j'image qu'il serait plus performant de le faire en une commande.

Merci.
0
dubcek Messages postés 19021 Statut Contributeur 5 637
 
on peuit mettre le code dans un fichier si la ligne devient trop longue
$ NODE=TOTO; STATUS=OK; awk -F ";" -v OFS=";" -v n=$NODE -v s=$STATUS '$3 ~ "^[ ]*" n "[ ]*$" {$0=$0 s; sub("TOTO", "STATUS", $3)} {print}' fic.txt
champ1;champ2; TOTO11; champ4;
champ1;champ2; 22TOTO; champ4;
champ1;champ2;STATUS; champ4;OK
champ1;champ2; STATUS; champ4;OK
champ1;champ2; TITI; champ4;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bob737 Messages postés 157 Statut Membre
 
Bonjour,

Je reviens sur le sujet car j'aimerais ajouter le condition de mettre le STATUS en fin de ligne soit sur le champ 5 dans notre exemple si et seulement si ce champ 5 est vide.

Merci.
0
bob737 Messages postés 157 Statut Membre
 
ok j'ai trouvé.
$3 == n && $5 ==""
0
jivef Messages postés 1024 Statut Membre 306
 
Bonjour,

As-tu essayé avec awk ?

echo "champ1;champs2;TOTO;champs4" | awk -F ";" '{ print $3}'
TOTO

Il te suffit de mettre le résultat de la commande dans une variable
var=$(echo "champ1;champs2;TOTO;champs4" | awk -F ";" '{ print $3}')
Et de vérifier le contenu de la variable.

Je ne sais pas si ça répond bien à ta question...
-1
jivef Messages postés 1024 Statut Membre 306
 
Bonjour,

J'accepte qu'on "moinsse" une de mes réponses, mais dans ce cas il faut expliquer pourquoi car c'est ce qui me permet de progresser.
Surtout que la solution proposée fonctionne !


Jivef :Certifié LPIC-1 (pour information).
0