Précédent   Forum des professionnels en informatique > Systèmes > Autres systèmes > Unix > AIX
AIX Forum d'entraide sur le système AIX. Avant de poster -> FAQ AIX et cours 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 10/02/2009, 11h46   #1
Invité de passage
 
Inscription : août 2006
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 16
Points : 2
Points : 2
Par défaut Shell : Réorganisation de données d'un fichier texte

Bonjour

J'ai un fichier texte issu d'un programme cobol avec des données textes (ASCII) qui vont de la colonne 0 à 160, et je voudrais par un script Shell réorganiser les enregistrements.

Je voudrais mettre sur une seule ligne toutes les données (enregistrements) de ce fichier texte de bout en bout comme dans un format fixe de type "no-text", c'est à dire sans retour à la ligne.

Serait-il possible de le faire avec une composition de commande unix : Avec SORT, WC....?

Qlq'un pourrait-il me guider sur la syntaxe ?
SHAD777 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2009, 16h18   #2
Invité de passage
 
Inscription : août 2006
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 16
Points : 2
Points : 2
Je précise qu'il s'agit d'un Shell Unix sous Aix.
SHAD777 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2009, 16h40   #3
Expert Confirmé Sénior
 
Homme Laurent Willems
Expert Stop/Start
Inscription : septembre 2002
Messages : 2 474
Détails du profil
Informations personnelles :
Nom : Homme Laurent Willems
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Expert Stop/Start

Informations forums :
Inscription : septembre 2002
Messages : 2 474
Points : 4 100
Points : 4 100
Salut,

Code :
1
2
tr -d '\n' < fichier_cobol > fichier_resultat
__________________
Alea Jacta Test!
Mygale1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2009, 17h29   #4
Invité de passage
 
Inscription : août 2006
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 16
Points : 2
Points : 2
Merci beaucoup Mygale Vous êtes un expert !

Bravos, voilà une syntaxe de commandes puissantes, moi qui pensait lire toutes les lignes une à une et les copier dans un fichier résultant à la suite.

Je ne connaissais pas cette commande 'TR'.

Toutefois, un petit 'hic' , la fin de chaque ligne du fichier cobol présente un vide de blanc de 6 espaces (de 154 à 160), et la commande n'en tient pas compte et positionne chaque ligne juste après le dernier caractère de la ligne.

Y at-il un moyen d'affiner la commande pour tenir compte d'un espace de 6 blancs ?
SHAD777 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2009, 17h43   #5
Expert Confirmé Sénior
 
Homme Laurent Willems
Expert Stop/Start
Inscription : septembre 2002
Messages : 2 474
Détails du profil
Informations personnelles :
Nom : Homme Laurent Willems
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Expert Stop/Start

Informations forums :
Inscription : septembre 2002
Messages : 2 474
Points : 4 100
Points : 4 100
Et bien toujours avec le commande tr


Code :
1
2
tr -d '\n' < fichier_cobol | tr -d ' ' > fichier_resultat
__________________
Alea Jacta Test!
Mygale1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2009, 17h57   #6
Invité de passage
 
Inscription : août 2006
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 16
Points : 2
Points : 2
Merci, bien tenté, mais cette fois-ci, il a supprimé tous les blancs de la ligne de données, et les resserre texte à texte sur une ligne. Bref, c'est pire...

Que signifie -d ' ' dans ce contexte ?

C'est le contraire qu'il faudrait, plutôt ajouter 6 blancs en fin de ligne de chaque enregistrement ligne.

Pas facile...
SHAD777 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2009, 23h22   #7
Expert Confirmé Sénior
 
Homme Laurent Willems
Expert Stop/Start
Inscription : septembre 2002
Messages : 2 474
Détails du profil
Informations personnelles :
Nom : Homme Laurent Willems
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Expert Stop/Start

Informations forums :
Inscription : septembre 2002
Messages : 2 474
Points : 4 100
Points : 4 100
Re sorry je n'ai pas lu l'énoncé jusqu'au bout

tr -d ' ' -> supprime les espaces

si tu veux avoir 6 blancs entre chaque ligne tu peux taper ceci:

Code :
1
2
cat fichier_cobol | xargs | sed -e 's/ /      /g'  > fichier_resultat
xargs va remplacer chaque saut de ligne par un espace et sed remplacera l'espace par 6 espaces
__________________
Alea Jacta Test!
Mygale1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2009, 12h07   #8
Invité de passage
 
Inscription : août 2006
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 16
Points : 2
Points : 2
Pas mal le combiné avec CAT + XARGS + SED
Mais il ne manque qu'un petit ajustement pour que ça fonctionne, car la syntaxe :

sed -e 's/ / 6 espaces /g'

a mis tous les espaces blancs des lignes sur 6 espaces, même les espaces dans la syntaxe des données. Mais ça a bien mis toutes lignes sur une seule ligne comme avec la commande TR. Et les 6 blancs qui séparent une ligne à une autre sont bien incrémentés.
Il faudrait donc incrémenter les 6 blancs seulement en fin de chaque ligne.

Est-ce la commande SED à reparamétrer ?
SHAD777 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2009, 14h13   #9
Expert Confirmé Sénior
 
Homme Laurent Willems
Expert Stop/Start
Inscription : septembre 2002
Messages : 2 474
Détails du profil
Informations personnelles :
Nom : Homme Laurent Willems
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Expert Stop/Start

Informations forums :
Inscription : septembre 2002
Messages : 2 474
Points : 4 100
Points : 4 100
Pourrais-tu fournir un échantillon de ton fichier généré par le programme cobol?
__________________
Alea Jacta Test!
Mygale1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2009, 14h48   #10
Invité de passage
 
Inscription : août 2006
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 16
Points : 2
Points : 2
Voilà, voilà ci-joint le fichier victest.txt
Toutes les lignes doivent être à la suite sur une seule ligne sachant qu'il y a 6 blancs à la fin de chaque ligne à incrémenter.

Je pensais faire du 'jonglage' ou 'parade' pas très conventionnel ni logique, c'est à dire dans le programme cobol qui génère le fichier , rajouter à la 160e colonne un caractère peu utilisé le '§' .
Ainsi les 6 espaces de fin de ligne auraient un marquage de fin. Puis ensuite le remplacer par un blanc après avoir mis les lignes sur une seule ligne :

tr -d '\n' < fichier.txt | tr '§' ' ' > fichier_résultat

Mais c'est mieux de ne pas toucher au cobol si un combiné unix serait possible.
Fichiers attachés
Type de fichier : txt VICTEST.txt (2,1 Ko, 8 affichages)
SHAD777 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2009, 16h21   #11
Expert Confirmé Sénior
 
Homme Laurent Willems
Expert Stop/Start
Inscription : septembre 2002
Messages : 2 474
Détails du profil
Informations personnelles :
Nom : Homme Laurent Willems
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Expert Stop/Start

Informations forums :
Inscription : septembre 2002
Messages : 2 474
Points : 4 100
Points : 4 100
Voilà

de cette manière ça devrait aller:

Code :
1
2
3
4
user@host:user$ cat test | sed -e  's/$/      /g' | tr -d '\n' > result
user@host:user$ cat result
0302        007399       0601 POCAR                                             E     0387700020701114                                              30003      0602        007399POC800002   JOURNALISATION 123      BNP Test                        00224000030722760000000000031000Données syste.periode   -20   30004      0602        007399POC800007   JOURNALISATION 123      Générale Test                   00405000507514120000000000023000Données syste.periode   -20   30003      0602        007399POC800013   JOURNALISATION 123      CRCA Test                       18000700191180840000000000046000Données syste.periode   -20   14806      0602        007399POC800021   JOURNALISATION 123      BANQUE POP. DE TEST             00510057190043830000000000031000Données syste.periode   -20   18707      0602        007399POC800022   JOURNALISATION 123      CE VAL DE FRANCE                00001040223403250000000000031000Données syste.periode   -20   14505      0602        007399POC800023   JOURNALISATION 123      CL Test                         057370000014082Z0000000000031000Données syste.periode   -20   30002      0602        007399POC800026   JOURNALISATION 123      CE VAL DE FRANCE                00001040247065190000000000016000Données syste.periode   -20   14505      0602        007399POC800027   JOURNALISATION 123      CL Test                         057370000009247E0000000000023000Données syste.periode   -20   30002      0602        007399POC800028   JOURNALISATION 123      Caisse Test                     00001041516566810000000000031000Données syste.periode   -20   14505      0602        007399POC800029   JOURNALISATION 123      STE GENERALE Test               00405000507396560000000000016000Données syste.periode   -20   30003      0602        007399POC800030   JOURNALISATION 123      CRCA Test                       18000283001140000000000000031000Données syste.periode   -20   14806      0602        007399POC800033   JOURNALISATION 123      Générale Test                   00405000507662040000000000031000Données syste.periode   -20   30003      0802        007399                                                                                    0000000000827000      user@host:user$
__________________
Alea Jacta Test!
Mygale1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2009, 16h47   #12
Invité de passage
 
Inscription : août 2006
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 16
Points : 2
Points : 2
Impeccable
De visu le fichier en résultat fonctionne

C'est donc le $ du sed -e 's/$/ /g' qui a fait la différence, et une mise à la ligne ensuite

Merci pour ton aide et maîtrise incontestée et surprenantes des instructions unix

Ce cas pourra servir à de nombreux usages, car il est fréquent de transmettre des fichiers d'enregistrements en une seule ligne (ASCII texte) dans les échanges de fichiers multi-standards : bandes de virements, bordereaux de reporting etc...
SHAD777 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2009, 15h07   #13
Invité de passage
 
Inscription : août 2006
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 16
Points : 2
Points : 2
Bonjour Mygal

Encore un petit ajout à la commande passée :
Actuellement, avec cette commande, la dernière ligne donne donc 6 espaces blancs.

Comment faire de sorte que seulement la dernière ligne présente 42 espaces blancs à la fin au lieu de 6 ?
SHAD777 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 +1. Il est actuellement 01h48.


 
 
 
 
Partenaires

Hébergement Web