Précédent   Forum des professionnels en informatique > Systèmes > Autres systèmes > Unix
Unix Forum d'entraide sur les systèmes Unix et dérivés (*BSD, AIX, etc.). Avant de poster ->F.A.Q BSD F.A.Q. Aix
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 31/08/2011, 16h42   #1
Nouveau Membre du Club
 
Inscription : mai 2008
Messages : 73
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 73
Points : 33
Points : 33
Par défaut Remplacer un champ d'une positionnée donnée

Bonjour,

Je souhaite parcourir un fichier en shell sh ou ksh (peu importe) et pour une positionnée donnée, remplacer le champ à cette position par autre chose.
Plus concrètement:
Soit mon fichier $fic_prov avec des lignes du type:
Code :
1
2
ACC|168063100|168063100|1|1680631||0|0||19900101000000||7||250
ABB|168063110|168063112|1|1680631001|1680631|1|0||20110118000000|
Je souhaite donc que pour une ligne commençant par ABB, il me remplace le deuxième champs 168063110 ( le délimiteur étant | ) par <champ_2>10; où 10 représente les deux derniers caractères du champ 2 (168063110).

Pour finir, je souhaite mettre le résultat final (fichier modifié) dans un autre fichier.

Actuellement j'essaye un truc pas très potable qui me provoque une erreur.
Voici un extrait du code:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
a=1
for fic_prov in $Repertoire/type_fichier*
do

nom_fic=`basename $fic_prov .txt`_"$a"_"txt" 

awk -F "|" '{ $2 = "<champ_2>substr($2,length("$2")-2,length("$2"))" ; print $0 > $nom_fic}' $fic_prov   

a=a+1

done
Erreur:
Code :
1
2
3
awk: syntax error near line 1
awk: bailing out near line 1
Merci d'avance
Decon est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/09/2011, 15h20   #2
Membre régulier
 
Inscription : mars 2009
Messages : 321
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 321
Points : 93
Points : 93
Bonjour,

As-tu eu une solution pour ta demande, si ce n'est pas le cas est-il possible de mettre un exemple du fichier résultant pour plus de clarté

A+
AAWOOPY56 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/09/2011, 15h49   #3
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
Avec l'énoncé du problème, c'est bien plus simple que cela :

traitement.awk
Code :
1
2
3
4
5
6
7
8
9
10
BEGIN{
FS="|"
OFS="|"

}
{
if ( $1 ~ /ABB/ ) $2="<champ_2>" gensub(/^.*(..)$/,"\\1","1",$2);
print $0
}
fic_prov
Code :
1
2
3
ACC|168063100|168063100|1|1680631||0|0||19900101000000||7||250
ABB|168063110|168063112|1|1680631001|1680631|1|0||20110118000000|
Et on applique
Code :
1
2
awk -f traitement.awk fic_prov
becket est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/09/2011, 11h12   #4
Membre régulier
 
Inscription : mars 2009
Messages : 321
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 321
Points : 93
Points : 93
Salut becket,

Merci pour ta solution, mais je trouve pas clair l'énoncé quand on dit je remplace le 2eme champ par champ2 du 10 ou 10 ...... et qui représente les 2 derniers caractères du champ 2 heu désolé de dire ça mais pour moi c'est l'embrouille à mon avis ce serait bien de mettre soit un exemple du résultat du fichier en sortie et de faire une nouvelle explication du besoin mais ce n'est que mon avis

Si tu veux expose ce que tu as compris STP et met un exemple du fichier en sortie

Merci d'avance A+
AAWOOPY56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h46.


 
 
 
 
Partenaires

Hébergement Web