SED: si condition 3eme champ alors ajout en fin de ligne [Résolu/Fermé]

Signaler
Messages postés
103
Date d'inscription
jeudi 24 septembre 2009
Statut
Membre
Dernière intervention
16 décembre 2019
-
Messages postés
924
Date d'inscription
mercredi 11 août 2004
Statut
Membre
Dernière intervention
17 janvier 2019
-
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
35388
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
14 août 2020
5 334
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
18192
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
13 août 2020
4 946
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
103
Date d'inscription
jeudi 24 septembre 2009
Statut
Membre
Dernière intervention
16 décembre 2019

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
18192
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
13 août 2020
4 946
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
103
Date d'inscription
jeudi 24 septembre 2009
Statut
Membre
Dernière intervention
16 décembre 2019

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
18192
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
13 août 2020
4 946
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
103
Date d'inscription
jeudi 24 septembre 2009
Statut
Membre
Dernière intervention
16 décembre 2019

super.
encore une question: quelle différence fais tu entre
$3 ~ "^[ ]*" n "[ ]*$" et $3 == n?

Dans mon cas, le champ 3 doit être strictement égal à n

Merci.
Messages postés
18192
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
13 août 2020
4 946
c'est juste si il y a des espaces avant et après TOTO, si il 'y en a pas, n suffit
Messages postés
18192
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
13 août 2020
4 946
fic.txt du post #1 contient des espaces, c'est pour ca que j'ai mis ces tests
Messages postés
103
Date d'inscription
jeudi 24 septembre 2009
Statut
Membre
Dernière intervention
16 décembre 2019

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
103
Date d'inscription
jeudi 24 septembre 2009
Statut
Membre
Dernière intervention
16 décembre 2019

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