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

Résolu/Fermé
Messages postés
130
Date d'inscription
jeudi 24 septembre 2009
Statut
Membre
Dernière intervention
20 septembre 2021
-
Messages postés
927
Date d'inscription
mercredi 11 août 2004
Statut
Membre
Dernière intervention
12 novembre 2020
-
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

Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 582
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;

Messages postés
18413
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
28 janvier 2022
5 534
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;
Messages postés
130
Date d'inscription
jeudi 24 septembre 2009
Statut
Membre
Dernière intervention
20 septembre 2021

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.
Messages postés
18413
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
28 janvier 2022
5 534
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;
Messages postés
130
Date d'inscription
jeudi 24 septembre 2009
Statut
Membre
Dernière intervention
20 septembre 2021

Merci!
Messages postés
130
Date d'inscription
jeudi 24 septembre 2009
Statut
Membre
Dernière intervention
20 septembre 2021

oups...je n'ai pas d'espace dans le 3eme champ.
Messages postés
18413
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
28 janvier 2022
5 534
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;
$
Messages postés
130
Date d'inscription
jeudi 24 septembre 2009
Statut
Membre
Dernière intervention
20 septembre 2021

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.
Messages postés
18413
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
28 janvier 2022
5 534
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;
Messages postés
130
Date d'inscription
jeudi 24 septembre 2009
Statut
Membre
Dernière intervention
20 septembre 2021

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.
Messages postés
130
Date d'inscription
jeudi 24 septembre 2009
Statut
Membre
Dernière intervention
20 septembre 2021

ok j'ai trouvé.
$3 == n && $5 ==""
Messages postés
927
Date d'inscription
mercredi 11 août 2004
Statut
Membre
Dernière intervention
12 novembre 2020
300
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...
Messages postés
927
Date d'inscription
mercredi 11 août 2004
Statut
Membre
Dernière intervention
12 novembre 2020
300
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).