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 29/01/2008, 08h56   #1
Invité régulier
 
Inscription : juillet 2006
Messages : 25
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 25
Points : 6
Points : 6
Par défaut Commande AWK ou SED pour modification données dans fichier

Bonjour,
Je me permets de vous écrire car je cherche à écrire une commande pour modifier un fichier de données. Cependant, malgré les exemples des différents topics du forum je n'ai pas réussi à faire mon programme comme je le souhaitais. Peut-être pourrez-vous me venir en aide.

En entrée : un fichier "à plat" volumineux de données qui porte une zone de montant à partir de la position 334 (sur 18 caractères numériques) et un libellé à partir de la position 364 (sur 20 caractères).

Objectif : créer une copie du fichier en multipliant le montant par 1.35 (par exemple) et modifiant le libellé de sorte que :
le libellé ABCDEFGHIJKLMNOPQRST devienne BADCFEHGJILKNMPORQTS

Je suppose que la commande AWK ou SED doit pouvoir gérer ça très facilement mais je n'arrive à trouver la bonne synthaxe.
Pourriez-vous m'indiquer comment faire si vous le voyez facilement (éventuellement via deux commandes (une pour le montant, une autre pour le libellé).

Merci d'avance
desbrandesq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2008, 17h56   #2
Membre habitué
 
Inscription : janvier 2007
Messages : 148
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 148
Points : 145
Points : 145
l'idée :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 
 
nawk '
    function return_lettres(chaine,index)
    {
      longueur=length(chaine);
 
      if ( (longueur - index) <= 1 )
      {
        return chaine;
      }
 
      carac1=substr(chaine,index,1);
      carac2=substr(chaine,index+1,1);
 
      debut_chaine=substr(chaine,0,index);
      fin_chaine=substr(chaine,index+2,longueur-(index+2));
 
      chaine_reconstitue=debut_chaine carac2 carac1 fin_chaine;
 
      return return_lettres(chaine_reconstitue,index+2);
    }
 
    BEGIN{
      debut_montant=334;
      longueur_montant=18;
 
      debut_libelle=364;
      longueur_libelle=20;
    }    
    { 
 
      debut=substr($0,0,debut_montant);
      milieu=substr($0,debut_montant+longueur_montant,debut_libelle);
      fin=substr($0,debut_libelle+longueur_libelle,length($0));
 
      montant=substr($0,debut_montant,longueur_montant);
      libelle=substr($0,debut_libelle,longueur_libelle);
 
      nouveau_libelle=return_lettres(libelle);
 
      montant=montant*1.3;
 
      printf("%s%s%s%s%s",debut,montant,milieu,nouveau_libelle,fin);
 
    } ' ${in_fic} >> $out_fic
Delwyn 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 12h53.


 
 
 
 
Partenaires

Hébergement Web