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

Résolu/Fermé
bob737 Messages postés 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024 - 15 juil. 2016 à 12:08
jivef Messages postés 927 Date d'inscription mercredi 11 août 2004 Statut Membre Dernière intervention 12 novembre 2020 - 3 mars 2017 à 01:48
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 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
15 juil. 2016 à 12:19
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 18757 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 19 décembre 2024 5 623
15 juil. 2016 à 13:35
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 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024
15 juil. 2016 à 14:26
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 18757 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 19 décembre 2024 5 623
15 juil. 2016 à 14:52
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 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024
15 juil. 2016 à 15:26
Merci!
0
bob737 Messages postés 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024
15 juil. 2016 à 17:02
oups...je n'ai pas d'espace dans le 3eme champ.
0
dubcek Messages postés 18757 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 19 décembre 2024 5 623
16 juil. 2016 à 08:11
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 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024
20 juil. 2016 à 18:45
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 18757 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 19 décembre 2024 5 623
21 juil. 2016 à 07:57
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 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024
Modifié par bob737 le 14/02/2017 à 14:58
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 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024
14 févr. 2017 à 15:51
ok j'ai trouvé.
$3 == n && $5 ==""
0
jivef Messages postés 927 Date d'inscription mercredi 11 août 2004 Statut Membre Dernière intervention 12 novembre 2020 306
17 févr. 2017 à 22:19
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 927 Date d'inscription mercredi 11 août 2004 Statut Membre Dernière intervention 12 novembre 2020 306
3 mars 2017 à 01:48
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