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 24/11/2010, 11h55   #1
Membre du Club
 
Inscription : août 2009
Messages : 65
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 65
Points : 44
Points : 44
Par défaut Formater un fichier

Bonjour,

J'ai deux fichiers à longueur variable :

Code :
1
2
3
4
fic1
AAA ZZZZ EEEEE
RRRRRR TTTTTT YYYYY
UUUUUUUU IIIIIIIIIIIII OOOOOOOOOOO
Code :
1
2
3
4
fic2
PPPP QQQQQ SSSSS
DDDDDDD FFFFFFFFFFF GGGGGGGGGG
HHHHHHHHHHH JJJJJ KKK
De plus, j'ai un fichier de paramétrage qui donne la longueur max que doit avoir fic1 et fic2. Voici donc à quoi il ressemble :

Code :
1
2
3
fichier param contient les deux lignes 
fic1;200
fic2;400
Ce que je cherche à faire : lire la longueur max de fic1 à partir du fichier de paramétrage et l'appliquer à toutes les lignes de ce fichier :

1- si la longueur d'une ligne de fic1 < à la longueur max, j'ajoute des blancs en fin de ligne
2- si la longueur d'une ligne de fic1 > à la longueur max, je coupe à la bonne longueur (200 premiers caractères)
3- si la longueur d'une ligne de fic1 = à la longueur max, je ne fais rien

A la fin du traitement, je dois obtenir un fichier fic1 de longueur fixe et qui correspond à 200 comme l'indique le fichier de paramétrage.

Le même traitement doit être appliqué pour fic2.

Je sais que awk est hyperpuissant pour faire cela mais je n'y arrive pas.
Si vous avez une idée, ça serait avec plaisir.

Merci d'avance pour votre aide.
emmachane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 15h26   #2
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 ne suis pas d'habitude à balancer des RTFM mais puisque tu connais l'outil, tu pouvais chercher un peu avant de poster ta question ....

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
 
BEGIN{
FS=";"
}
{
        result=1
        myfile=$1
        mysize=$2
        getline myvar < myfile
        for( i=0 ; result!=0  ; result=getline myvar < myfile )
        {
                if ( length(myvar) <= mysize)
                {
                        chaine=" "
                        for ( i=0 ; i <= ( mysize - length(myvar) ) ; i++ )
                        {
                                chaine=chaine" "
 
                        }
                        print myvar chaine
                }
                else
                {
                        print substr(myvar,0,mysize )
 
                }
 
                i++
        }
becket est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/11/2010, 21h43   #3
Membre du Club
 
Inscription : août 2009
Messages : 65
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 65
Points : 44
Points : 44
Par défaut Merci becket

Merci beaucoup pour la réponse.
J'ai testé le code et j'ai rencontré deux soucis :

Le premier porte sur le nombre d'espaces ajoutés quand la longueur est inférieure à la longueur souhaitée. Le code
avec la boucle
Code :
for ( i=0 ; i <= ( mysize - length(myvar) ) ; i++ )
génère deux espaces en trop à la fin des enregistrements.

Le second souci porte sur la boucle :
Code :
 for( i=0 ; result!=0  ; result=getline myvar < myfile )
si le fichier myfile n'existe pas, la boucle tourne à l'infini.
emmachane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2010, 00h50   #4
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
Tu as constaté que le code est a modifier pour que cela rencontre exactement tes attentes. Modifie le pour qu'il le devienne ou explique ce que tu as fait comme modifications qui ne fonctionnent pas mais cela ne me tente pas d'écrire les corrections pour toi.
becket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2010, 11h40   #5
Membre du Club
 
Inscription : août 2009
Messages : 65
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 65
Points : 44
Points : 44
Par défaut Tout à fait

Tu as tout à fait raison de souligner que l'essentiel était dans ton code et je réitère mes remerciements. Je suis impressionnant pour la puissance de awk et par ceux qui le maitrisent.

Je fais passer le statut du message à "Résolu"
emmachane 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 15h44.


 
 
 
 
Partenaires

Hébergement Web