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 04/01/2008, 12h47   #1
DIE
Membre à l'essai
 
Inscription : août 2005
Messages : 82
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 82
Points : 24
Points : 24
Par défaut Substituer un seul caractère en AWK

Bonjour,
Je suis toujours sur mon script de variabilisation.
Maintenant j'essai de substituer UN seul caractère dans une chaine de caractère.

Par exemple, soit la ligne de mon fichier :
RUN PROGRAM(SRLOSABA) PLAN(SRLOS77A)

ce qui m'interesse c'est de substituer le 7 en gras par la variable £JEU,
j'ai essayé avec un sub mais le problème c'est qu'il me substitue le premier
7 et non le second (c'est toujours le dernier chiffre qui doit etre variabilisé)


J'ai réussi à faire en sorte que mon AWK fonctionne en matchant les lignes comme si dessous

Code :
1
2
3
4
5
6
7
match($0,"PLAN[(].*[0-9][ABSP][)]")     {
                          JEU=substr($0,RSTART+(RLENGTH-3),1)
                          JEU_match=substr($0,RSTART+5,RLENGTH-7)
                          JEU_debut=substr($0,RSTART+5,RLENGTH-8)
                          JEU_chaine=JEU_debut"£JEU"
                          sub(JEU_match,JEU_chaine)
}
RESULTAT :
RUN PROGRAM(SRLOSABA) PLAN(SRLOS7£JEUA)

ça marche bien comme ci dessus (découpant les chaines de caractère avant et après le 7 et en recollant le tout) mais je trouve que cela fait très usine à gaz
comment substituer un seul caractère déterminé dans une chaine ?

Merci
__________________
############
# KSH sous AIX #
############
DIE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2008, 11h58   #2
Membre expérimenté
 
Avatar de BlaireauOne
 
Inscription : mars 2007
Messages : 469
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2007
Messages : 469
Points : 576
Points : 576
Que penses-tu de ceci

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
echo "liste.txt"
cat liste.txt
 
echo -e "\nTraitement"
awk '
{
	if (match($0,"^RUN PROGRAM.* PLAN.*[0-9]+")) {
		LastDigit=substr($0,RLENGTH,1)
		print "Record "NR" : position et valeur du dernier chiffre présent après la chaîne PLAN : "RLENGTH", "LastDigit | "cat 1>&2"
		print substr($0,RSTART,RLENGTH-1)"£JEU"substr($0,RLENGTH+1)
	}
} ' liste.txt > result.txt
 
echo -e "Fin Traitement\n"
echo "result.txt"
cat result.txt

liste.txt
RUN PROGRAM(SRLOSABA) PLAN(SRLOSA)
RUN PROGRAM(SRLOSABA) PLAN(SRLOS12345A)
RUN PROGRAM(SRLOSABA) PLAN(SRLOS77A)
RUN PROGRAM(SRLOSABA) PLAN(SRLOS77A88)

Traitement
Record 2 : position et valeur du dernier chiffre présent après la chaîne PLAN : 37, 5
Record 3 : position et valeur du dernier chiffre présent après la chaîne PLAN : 34, 7
Record 4 : position et valeur du dernier chiffre présent après la chaîne PLAN : 37, 8
Fin Traitement

result.txt
RUN PROGRAM(SRLOSABA) PLAN(SRLOS1234£JEUA)
RUN PROGRAM(SRLOSABA) PLAN(SRLOS7£JEUA)
RUN PROGRAM(SRLOSABA) PLAN(SRLOS77A8£JEU)
__________________
Loi de Murphy:
La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.
BlaireauOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 16h43   #3
Nouveau Membre du Club
 
Inscription : avril 2007
Messages : 88
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 88
Points : 39
Points : 39
Bonjour,

C'est une commande tres intéressant.. merci
Par contre qu'est ce que fait le "cat" dans ta commande awk ?

Merci
aikinhdo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 21h21   #4
Membre expérimenté
 
Avatar de BlaireauOne
 
Inscription : mars 2007
Messages : 469
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2007
Messages : 469
Points : 576
Points : 576
Dans l'exemple ci-dessous :

print $0 :
- écris $0 dans le fichier déclaré par la variable $outfile

print "blah blah" | "cat 1>&2"
- écris "blah bla" dans la sortie standard (1), elle-même redirigée vers la stderr - sortie standard d'erreur (2) - en l'occurence l'écran.

Code :
1
2
3
4
5
awk '
{
    print $0
    print "blah blah" | "cat 1>&2"
} ' $infile > $outfile


Voir http://marcg.developpez.com/ksh/

.../...
Redirection,Substitution,enchaînement Les redirections sont le détournement des 3 descripteurs de fichiers standards à savoir :
3.1. Les redirections en sortie
3.2. Les redirections en entrée
.../...
3.3. La redirection des erreurs
3.4. Les enchaînements (pipe et tee)
.../...
Les redirections sont le détournement des 3 descripteurs de fichiers standards à savoir :
l'entrée standard (noté 0) : le clavier
la sortie standard (noté 1) : la console courante
la sortie des erreurs (noté 2) : la console courante
.../...
__________________
Loi de Murphy:
La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.
BlaireauOne 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 17h10.


 
 
 
 
Partenaires

Hébergement Web