Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/12/2006, 11h05   #1
Membre à l'essai
 
Inscription : mai 2004
Messages : 148
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 148
Points : 24
Points : 24
Par défaut Script avec sed et awk

Bonjour tlm,

quelqu'un peut m'aider pour ecrire un script avec awk et sed ?

Voila, j'ai un fichier que je veux modifier quelques lignes et le resultat sera
diriger vers un nouveau fichier.

En fait les lignes que je veux modifier commence toute avec la meme chaine de caractères, mais chaque lignes est diviser en plusieurs champs, et moi je veux modifier le 3ème champ de cette ligne

Merci.
arezki76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2006, 11h27   #2
Membre confirmé
 
Inscription : octobre 2005
Messages : 344
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 344
Points : 270
Points : 270
Je ne l'ai pas testé, mais ça devrait marcher ....

Citation:
while read ligne
do
champs1=`echo $ligne | awk '{print $1}'`
# on teste si la ligne commence par le mot voulu
if [ "$champs1" = "<chaine de caractere voulue>" ]
then
champs3=`echo $ligne | awk '{print $3}'`
# on remplace le troisieme mot par ce que l on veut
ligne=`echo $ligne | sed s/"$champs3"/"new_champs3"`
fi
echo $ligne >> nouveau_fichier
done < old_fichier
usf70 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2006, 11h42   #3
Membre à l'essai
 
Inscription : mai 2004
Messages : 148
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 148
Points : 24
Points : 24
Par défaut Script shell avec awk et sed

Bonjour,

Merci pour la portion du script. Seulement ou dois je spécifier le nom de fichier à traiter, vu que j'en ai plusieurs dans le repertoire.

Merci pour ta précieuse aide.
arezki76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2006, 12h53   #4
Membre confirmé
 
Inscription : octobre 2005
Messages : 344
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 344
Points : 270
Points : 270
il y a deux façons de faire : soit :
Citation:
for old_fichier in fichier1 fichier2 ... fichiern
do
...
done
ou alors :
Citation:
for old_fichier in `ls -1 fichier*`
...
done
et remplacer old_fichier dans mon script précédent par $old_fichier
usf70 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2006, 16h47   #5
Membre à l'essai
 
Inscription : mai 2004
Messages : 148
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 148
Points : 24
Points : 24
Bonjour,

Voila je résume :

for file in `ls -1 *.txt`
do
while read ligne
do
champs1=`echo $ligne | awk '{print $1}'`
# on teste si la ligne commence par le mot voulu
if [ "$champs1" = "debut de la chaine" ]
then
champs3=`echo $ligne | awk '{print $3}'`
# on remplace le troisieme mot par ce que l on veut
ligne=`echo $ligne | sed s/"$champs3"/"**********"`
fi
echo $ligne >> image_fichier_test.txt
done
done

Mais j'ai lancer le script et il ya rien .

Merci
arezki76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2006, 17h48   #6
Membre confirmé
 
Inscription : octobre 2005
Messages : 344
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 344
Points : 270
Points : 270
tu as oublié dans le premier done:
Citation:
done < $file
usf70 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2006, 13h02   #7
Membre à l'essai
 
Inscription : mai 2004
Messages : 148
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 148
Points : 24
Points : 24
Par défaut script shell avec sed et awk

Bonjour,

Je crois qu'il manque quelque chose dans la partie de substitution de sed, car j'ai le message suivant :

mon_script.sh[11]: [debut de la chaine: not found.

Merci.
arezki76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2006, 14h20   #8
Membre confirmé
 
Inscription : octobre 2005
Messages : 344
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 344
Points : 270
Points : 270
il manque le "/" à la fin :

Citation:
ligne=`echo $ligne | sed s/"$champs3"/"**********"/`
usf70 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2007, 10h38   #9
Membre à l'essai
 
Inscription : mai 2004
Messages : 148
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 148
Points : 24
Points : 24
Par défaut script avec sed et awk

Bonjour,

Ca marche tjs pas. De plus le fichier généré a perdu le formatage comme le fichier initial.

Merci
arezki76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2007, 10h56   #10
Membre Expert
 
Avatar de becket
 
Frédéric Brugmans
Informaticien multitâche
Inscription : février 2005
Messages : 661
Détails du profil
Informations personnelles :
Nom : Frédéric Brugmans

Informations professionnelles :
Activité : Informaticien multitâche

Informations forums :
Inscription : février 2005
Messages : 661
Points : 1 196
Points : 1 196
Ce ne serait pas plus simple comme ceci ? :

Citation:
awk -F"SEPARATEUR" '{ gsub("REGEXP","MODIFICATIONCHAINE",$3) ; print $0 }' > fichier
becket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2007, 11h32   #11
Membre à l'essai
 
Inscription : mai 2004
Messages : 148
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 148
Points : 24
Points : 24
Par défaut script avec sed et awk

Bjr,

Peux tu m'expliquer cette instruction ? plz
arezki76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2007, 11h37   #12
Membre Expert
 
Avatar de becket
 
Frédéric Brugmans
Informaticien multitâche
Inscription : février 2005
Messages : 661
Détails du profil
Informations personnelles :
Nom : Frédéric Brugmans

Informations professionnelles :
Activité : Informaticien multitâche

Informations forums :
Inscription : février 2005
Messages : 661
Points : 1 196
Points : 1 196
awk -F"SEPARATEUR" '{ gsub("REGEXP","MODIFICATIONCHAINE",$3) ; print $0 }' > fichier

Pour un SEPARATEUR : SEPARATEUR
Modifie le champ 3 $3 en remplacant l'expression reguliere REGEXP par la chaine MODIFICATIONCHAINE

Une fois que c'est fait, tu affiches la ligne au complet
becket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2007, 11h46   #13
Membre à l'essai
 
Inscription : mai 2004
Messages : 148
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 148
Points : 24
Points : 24
Par défaut script avec sed et awk

Dans ce cas, le SEPARATEUR serait $CHAMPS1, REGEXP serait $CHAMPS3, et MODIFICATIONCHAINE serait ma nouvelle chaine de caractères, n'est pas ?

Merci
arezki76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2007, 12h30   #14
Membre Expert
 
Avatar de becket
 
Frédéric Brugmans
Informaticien multitâche
Inscription : février 2005
Messages : 661
Détails du profil
Informations personnelles :
Nom : Frédéric Brugmans

Informations professionnelles :
Activité : Informaticien multitâche

Informations forums :
Inscription : février 2005
Messages : 661
Points : 1 196
Points : 1 196
je vais prendre un exemple concret :

soit un fichier fichier.txt qui contient

coucou|lala|truc|mucherg
coucou|lala|truc|muchegr
coucou|lala|truc|muchefvr
coucou|lala|truc|muchef
coucou|lala|truc|muchefje


j'ameliore au passage mon fichier.awk

Code :
1
2
3
4
5
6
7
8
9
10
 
BEGIN {
 
        FS="|" 
        OFS="|"
}
{
        sub("uc","Oulala",$3) ; print $0
 
}
FS etant le séparateur de champ en entrée
OFS etant le séparateur de champ en sortie

dans le champ 3 je remplace "uc" par "oulala" ( exemple stupide inside )

awk -f fichier.awk fichier.txt > nouveau_fichier.txt

Resultat
Code :
1
2
3
4
5
6
 
coucou|lala|trOulala|mucherg
coucou|lala|trOulala|muchegr
coucou|lala|trOulala|muchefvr
coucou|lala|trOulala|muchef
coucou|lala|trOulala|muchefje
becket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2007, 14h44   #15
Membre à l'essai
 
Inscription : mai 2004
Messages : 148
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 148
Points : 24
Points : 24
Par défaut script avec

Re-bjr,

je crois que c'est mieux que ce que j'avais auparavant, seulement la chaine que je veux modifier n'est pas identique dans toute les lignes, elle varie.

Ya t-il un moyen de contourner le fichier .awk ?


Merci bcp pour ta précieuse aide.
arezki76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2007, 14h56   #16
Membre Expert
 
Avatar de becket
 
Frédéric Brugmans
Informaticien multitâche
Inscription : février 2005
Messages : 661
Détails du profil
Informations personnelles :
Nom : Frédéric Brugmans

Informations professionnelles :
Activité : Informaticien multitâche

Informations forums :
Inscription : février 2005
Messages : 661
Points : 1 196
Points : 1 196
Si tu donnais un exemple avec fichier d'entrée et de sortie avec quelques explications, ce serait bienvenu
becket est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h53.


 
 
 
 
Partenaires

Hébergement Web